java oom是什么?oom 是什么意思
大家好,如果您还对java oom是什么不太了解,没有关系,今天就由本站为大家分享java oom是什么的知识,包括oom 是什么意思的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
什么情况下OOM会终止java进程
防止重要的系统进程触发(OOM)机制而被杀死:可以设置参数/proc/PID/oom_adj为-17,可临时关闭linux内核的OOM机制。内核会通过特定的算法给每个进程计算一个分数来决定杀哪个进程,每个进程的oom分数可以/proc/PID/oom_score中找到。我们运维过程中保护的一般是sshd和一些管理agent。
保护某个进程不被内核杀掉可以这样操作:
# echo-17>/proc/$PID/oom_adj
如何防止sshd被杀,可以这样操作:
# pgrep-f"/usr/sbin/sshd"| while read PID;do echo-17>/proc/$PID/oom_adj;done
可以在计划任务里加入这样一条定时任务,就更安全了:
#/etc/cron.d/oom_disable
*/1**** root pgrep-f"/usr/sbin/sshd"| while read PID;do echo-17>/proc/$PID/oom_adj;done
为了避免重启失效,可以写入/etc/rc.d/rc.local
echo-17>/proc/$(pidof sshd)/oom_adj
至于为什么用-17而不用其他数值(默认值为0),这个是由linux内核定义的,查看内核源码可知:
以linux-3.3.6版本的kernel源码为例,路径为linux-3.6.6/include/linux/oom.h,阅读内核源码可知oom_adj的可调值为15到-16,其中15最大-16最小,-17为禁止使用OOM。oom_score为2的n次方计算出来的,其中n就是进程的oom_adj值,所以oom_score的分数越高就越会被内核优先杀掉。
当然还可以通过修改内核参数禁止OOM机制
# sysctl-w vm.panic_on_oom=1
vm.panic_on_oom= 1//1表示关闭,默认为0表示开启OOM
# sysctl-p
java oom异常怎么解决方案
在 Java中,JavaVM拥有自动管理内存的功能,Java的GC能够进行垃圾回收,但是Android中如果ImageView使用过多的Bitmap的话,经常会报OOM(内存溢出)。
造成内存溢出及解决方案:
1.使用BitmapFactory.decodeStream替代createBitmap方法
原因是该方法直读取图片字节,调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap。
2.使用压缩读取技术
BitmapFactory.Options options= new BitmapFactory.Options();
options.inJustDecodeBounds= true;
BitmapFactory.decodeFile(imageSdUri, options);
final int height= options.outHeight;
final int width= options.outWidth;
options.inSampleSize= 1;
int w= 320;
int h= 480;
h= w*height/width;//计算出宽高等比率
int a= options.outWidth/ w;
int b= options.outHeight/ h;
options.inSampleSize= Math.max(a, b);
options.inJustDecodeBounds= false;
Bitmap bitmap= BitmapFactory.decodeFile(imageSdUri, options);
3.及时释放Bitamp
Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。但是我它应该还是能大大的加速Bitmap的主要内存的释放。
oom 是什么意思
OOM Killer(Out of Memory Killer)是当系统内存严重不足时 linux内核采用的杀掉进程,释放内存的机制。
OOM Killer通过检查所有正在运行的进程,然后根据自己的算法给每个进程一个 badness分数,拥有最高 badness分数的进程将会在内存不足时被杀掉。
它打分的算法如下:
某一个进程和它所有的子进程都占用了很多内存的将会打一个高分。
为了释放足够的内存来解决这种情况,将杀死最少数量的进程(最好是一个进程)。
内核进程和其他较重要的进程会被打成相对较低的分。
上面打分的标准意味着,当 OOM killer选择杀死的进程时,将选择一个使用大量内存,有很多子进程且不是系统进程的进程。
简单来讲,oom-killer的原则就是损失最小、收益最大,因此它会让杀死的进程数尽可能小、释放的内存尽可能大。在数据库服务器上,MySQL被分配的内存一般不会小,因此容易成为 oom-killer选择的对象。
“既然发生了 OOM,那必然是内存不足,内存不足这个问题产生原因很多。
首先第一个就是 MySQL自身内存的规划有问题,这就涉及到 mysql相应的配置参数。
另一个可以想到的原因就是一般部署 MySQL的服务器,都会部署很多的监控和定时任务脚本,而这些脚本往往缺少必要的内存限制,导致在高峰期的时候占用大量的内存,导致触发 Linux的 oom-killer机制,最终 MySQL无辜躺枪牺牲。”
java 读20M的excel,怎么做才不抛oom
一般都是用jacob的,这里不能发地址,自己搜一下,要下1.9的版本
1、我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件
2、将压缩包解压后,Jacob.jar添加到Libraries中;
3、将Jacob.dll放至“WINDOWS\SYSTEM32”下面。
需要注意的是:
【使用IDE启动Web服务器时,系统读取不到Jacob.dll,例如用MyEclipse启动Tomcat,就需要将dll文件copy到MyEclipse安装目录的“jre\bin”下面。
一般系统没有加载到Jacob.dll文件时,报错信息为:“java.lang.UnsatisfiedLinkError: no jacob in java.library.path”】
使用Jacob转换Word,Excel为HTML
JAVA代码:
Java代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class TransformFiletoHtml
{
int WORD_HTML= 8;
int WORD_TXT= 7;
int EXCEL_HTML= 44;
/**
* WORD转HTML
*@param docfile WORD文件全路径
*@param htmlfile转换后HTML存放路径
*/
public void wordToHtml(String docfile, String htmlfile)
{
ActiveXComponent app= new ActiveXComponent("Word.Application");//启动word
try
{
app.setProperty("Visible", new Variant(false));
Dispatch docs= app.getProperty("Documents").toDispatch();
Dispatch doc= Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[], new int[1]).toDispatch();
Dispatch.invoke(doc,"SaveAs", Dispatch.Method, new Object[], new int[1]);
Variant f= new Variant(false);
Dispatch.call(doc,"Close", f);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
app.invoke("Quit", new Variant[]{});
}
}
/**
* EXCEL转HTML
*@param xlsfile EXCEL文件全路径
*@param htmlfile转换后HTML存放路径
*/
public void excelToHtml(String xlsfile, String htmlfile)
{
ActiveXComponent app= new ActiveXComponent("Excel.Application");//启动excel
try
{
app.setProperty("Visible", new Variant(false));
Dispatch excels= app.getProperty("Workbooks").toDispatch();
Dispatch excel= Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[], new int[1]).toDispatch();
Dispatch.invoke(excel,"SaveAs", Dispatch.Method, new Object[], new int[1]);
Variant f= new Variant(false);
Dispatch.call(excel,"Close", f);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
app.invoke("Quit", new Variant[]{});
}
}
/**
*/删除指定文件夹
*@param folderPath文件夹全路径
*@param htmlfile转换后HTML存放路径
*/
public void delFolder(String folderPath)
{
try
{
delAllFile(folderPath);//删除完里面所有内容
String filePath= folderPath;
filePath= filePath.toString();
java.io.File myFilePath= new java.io.File(filePath);
myFilePath.delete();//删除空文件夹
} catch(Exception e)
}
/**
*/删除指定文件夹下所有文件
*@param path文件全路径
*/
public boolean delAllFile(String path)
{
boolean flag= false;
File file= new File(path);
if(!file.exists())
{
return flag;
}
if(!file.isDirectory())
{
return flag;
}
String[] tempList= file.list();
File temp= null;
for(int i= 0; i< tempList.length; i++)
{
if(path.endsWith(File.separator))
{
temp= new File(path+ tempList[i]);
}
else
{
temp= new File(path+ File.separator+ tempList[i]);
}
if(temp.isFile())
{
temp.delete();
}
if(temp.isDirectory())
{
delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件
delFolder(path+"/"+ tempList[i]);//再删除空文件夹
flag= true;
}
}
return flag;
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class TransformFiletoHtml
{
int WORD_HTML= 8;
int WORD_TXT= 7;
int EXCEL_HTML= 44;
/**
* WORD转HTML
*@param docfile WORD文件全路径
*@param htmlfile转换后HTML存放路径
*/
public void wordToHtml(String docfile, String htmlfile)
{
ActiveXComponent app= new ActiveXComponent("Word.Application");//启动word
try
{
app.setProperty("Visible", new Variant(false));
Dispatch docs= app.getProperty("Documents").toDispatch();
Dispatch doc= Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[], new int[1]).toDispatch();
Dispatch.invoke(doc,"SaveAs", Dispatch.Method, new Object[], new int[1]);
Variant f= new Variant(false);
Dispatch.call(doc,"Close", f);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
app.invoke("Quit", new Variant[]{});
}
}
/**
* EXCEL转HTML
*@param xlsfile EXCEL文件全路径
*@param htmlfile转换后HTML存放路径
*/
public void excelToHtml(String xlsfile, String htmlfile)
{
ActiveXComponent app= new ActiveXComponent("Excel.Application");//启动excel
try
{
app.setProperty("Visible", new Variant(false));
Dispatch excels= app.getProperty("Workbooks").toDispatch();
Dispatch excel= Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[], new int[1]).toDispatch();
Dispatch.invoke(excel,"SaveAs", Dispatch.Method, new Object[], new int[1]);
Variant f= new Variant(false);
Dispatch.call(excel,"Close", f);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
app.invoke("Quit", new Variant[]{});
}
}
/**
*/删除指定文件夹
*@param folderPath文件夹全路径
*@param htmlfile转换后HTML存放路径
*/
public void delFolder(String folderPath)
{
try
{
delAllFile(folderPath);//删除完里面所有内容
String filePath= folderPath;
filePath= filePath.toString();
java.io.File myFilePath= new java.io.File(filePath);
myFilePath.delete();//删除空文件夹
} catch(Exception e)
}
/**
*/删除指定文件夹下所有文件
*@param path文件全路径
*/
public boolean delAllFile(String path)
{
boolean flag= false;
File file= new File(path);
if(!file.exists())
{
return flag;
}
if(!file.isDirectory())
{
return flag;
}
String[] tempList= file.list();
File temp= null;
for(int i= 0; i< tempList.length; i++)
{
if(path.endsWith(File.separator))
{
temp= new File(path+ tempList[i]);
}
else
{
temp= new File(path+ File.separator+ tempList[i]);
}
if(temp.isFile())
{
temp.delete();
}
if(temp.isDirectory())
{
delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件
delFolder(path+"/"+ tempList[i]);//再删除空文件夹
flag= true;
}
}
return flag;
}
}调用JAVA代码:
Java代码
public class Test1{
public static void main(String[] args){
// TODO Auto-generated method stub
TransformFiletoHtml trans= new TransformFiletoHtml();
trans.wordToHtml("D:\\sinye.doc","D:\\sinye.html");
}
}
public class Test1{
public static void main(String[] args){
// TODO Auto-generated method stub
TransformFiletoHtml trans= new TransformFiletoHtml();
trans.wordToHtml("D:\\sinye.doc","D:\\sinye.html");
}
}只写了一个测试word转html的,excel转html的同理,在TransformFiletoHtml类中,写了两个方法,一个是删除文件夹的方法(delFolder()),一个是删除文件夹下所有文件的方法(delAllFile())。
java oom是什么和oom 是什么意思的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!