昆山有建设网站的吗,企业大全官网,漂亮的php网站源码,哈尔滨做网站优化堆内存调优
当遇到OOM时#xff0c;可以进行调参
1、尝试扩大堆内存看结果
2、分析内存#xff0c;看哪个地方出现了问题#xff08;专业工具#xff09;
调整初始分配内存为1024M#xff0c;调整最大分配内存为1024M#xff0c;打印GC细节#xff08;如何添加JVM操…堆内存调优
当遇到OOM时可以进行调参
1、尝试扩大堆内存看结果
2、分析内存看哪个地方出现了问题专业工具
调整初始分配内存为1024M调整最大分配内存为1024M打印GC细节如何添加JVM操作往下看 -Xms1024m -Xmx1024m -XX:PrintFGCDetails 在一个项目中突然出现了OOM故障那么该如何排除研究为什么出错
能够看到代码第几行出错内存快照分析工具MATJprofilerDubug一行行分析代码
MATJprofiler作用
分析Dump内存文件快速定位内存泄露获得堆中的数据获得大的对象…
下面是一个使用Jprofile查OOM来源的示例
已经下载好了Jprofile以及Idea插件
首先写一个必定会OOM的代码
import java.util.ArrayList;public class Demo {byte[] array new byte[1*1024*1024];//1mpublic static void main(String[] args) {ArrayListDemo list new ArrayList();int count 0;try{while(true){list.add(new Demo());count count 1;}}catch (Exception e){}}
}该问题会虽然用try-catch尝试捕获异常但问题是OOM是Error而非Exception因此无法排查错误。
首先 我们需要添加一些JVM的操作以至于我们可以在程序运行后在终端查询到JVM的反馈
1、添加JVM操作 2、添加JVM操作栏该IDE版本为2023版因此许多UI做出了修改与狂神说的UI不同 3、在VM option内写下 -Xms1m -Xmx8m -XX:HeapDumpOnOutOfMemoryError意思为限制初始化堆内存大小为1M最大堆内存为8MDump出OOM 接下来运行程序终端会给出JVM信息下列信息中第一行表示出现OOM位置在HeapSpace即堆空间。第二行表示已经将堆dump出一个.hprof文件名字为java_pid44260你可以在文件夹中找到它也可以直接在project中找到它 可以发现除了java_pin44260.hprof文件外还dump出了一个文件夹这个文件夹中包含了大量信息十分占用空间如果排查完错误记得删除。 点开java_pin44260.hprof如果安装好Jprofile则会直接跳转到Jprofile这里可以看到各类占用的空间大小 跳到Biggest Objects,可以看到大部分的内存都是由ArrayList构成的且可以看到它的类型为byte[]现在我们里真相很近了 点击Thread Dump查看线程Dump因为示例中并没有开多线程因此问题大概率是出现在main线程中天使线程大概率是不会出现问题的所以直接查main我们可以发现main线程中发现了OOM且给出了具体位置具体行数 点进去即可直接跳转到相应位置我们发现它直接跳到Demo.java中光标停留在main方法上说明问题在此并且Jprofile给出了具体行数17行因此我们就可以锁定问题所在了就在这
import java.util.ArrayList;// Dump文件
public class Demo {// -Xms1m -Xmx8m -XX:HeapDumpOnOutOfMemoryErrorbyte[] array new byte[1*1024*1024];//1mpublic static void main(String[] args) {ArrayListDemo list new ArrayList();int count 0;try{while(true){
//------------------------------------------------------------------list.add(new Demo());//问题所在
//------------------------------------------------------------------count count 1;}}catch (Exception e){}}
}