首页编程java编程java oom是什么?oom 是什么意思

java oom是什么?oom 是什么意思

编程之家 2023-10-14 85次浏览

大家好,如果您还对java oom是什么不太了解,没有关系,今天就由本站为大家分享java oom是什么的知识,包括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

java oom是什么?oom 是什么意思

如何防止sshd被杀,可以这样操作:

# pgrep-f"/usr/sbin/sshd"| while read PID;do echo-17>/proc/$PID/oom_adj;done

可以在计划任务里加入这样一条定时任务,就更安全了:

java oom是什么?oom 是什么意思

#/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 是什么意思的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

java为什么linux系统信息?为什么java要在linux下部署,有什么好处 什么是java阻塞队列?java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么