package com.yuan;
/**
* @author QLBF
* @version 1.0
* @date 2021/5/27 20:24
*/
public class demo2 {
public static void main(String[] args) {
//返回Java虚拟机试图使用的最大内存量
long maxMemory = Runtime.getRuntime().maxMemory();
//返回JVM初始总内存
long totalMemory = Runtime.getRuntime().totalMemory();
System.out.println("试图最大内存量:"+maxMemory+"字节, "+maxMemory/(double)1024/1024+"MB");
System.out.println("JVM初始总内存:"+totalMemory+"字节, "+totalMemory/(double)1024/1024+"MB");
}
}
初始的堆内存:
发现,默认的情况下分配的内存是总内存的 1/4,而初始化的内存为 1/64 !
1.调堆的内存
刚刚是默认的内存,现在我们来调一下堆的内存:
IDEA中进行JVM调优参数设置,然后启动
VM参数调优:把初始内存,和总内存都调为 1024M(可以自己设,这就是调堆的大小,属于JVM调优了),在上面输入:
1、-Xms 等价于 -XX:InitialHeapSize 初始堆大小
2、-Xmx 等价于 -XX:MaxHeapSize 最大堆大小
-Xms1024m -Xmx1024m -XX:+PrintGCDetails
VM参数调优:把初始内存,和总内存都调为 1024M,运行,查看结果!(还是使用上面的代码)
2.模拟OMM出现
package com.yuan;
import java.util.Random;
/**
* @author QLBF
* @version 1.0
* @date 2021/5/27 20:43
*/
public class demo3 {
public static void main(String[] args) {
String str="hellowordhelloworld";
while (true){
str+=str+new Random().nextInt(88888888)
+new Random().nextInt(999999999);
}
}
}
我们先像刚刚那样设置VM的大小,VM就是虚拟机的大小(一般也为堆的大小?),只不过不想刚刚设为1024M了,现在我们都设为8M就好了,为了模拟出OOM:
-Xms8m -Xmx8m -XX:+PrintGCDetails
运行:
爆OOM了。(若养老区执行了Full GC后发现依然无法进行对象的保存,就会产生OOM异常 )
解决OOM的方法(重点):
1.设置VM,把堆的大小调大,就是我们刚刚演示的那种,如果调大了还爆OOM,证明是代码的问题了。
2.使用JProfiler看哪里出错了(更好)
3.JProfiler使用
JProfiler就是来分析dump内存快照的
package com.yuan;
import java.util.ArrayList;
/**
* @author QLBF
* @version 1.0
* @date 2021/5/27 21:35
*/
public class demo4 {
byte[] byteArray=new byte[1*1024*1024]; //1M
public static void main(String[] args) {
ArrayList<demo4> list=new ArrayList<>();
int count=0;
try {
while (true){
list.add(new demo4());
count+=1;
}
} catch (Error e) {
System.out.println("count了几次:"+count);
e.printStackTrace();
}
}
}
我们先设置vm参数再运行 :
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
这是出现OutOfMemoryError错误就会生成dump文件的意思,你也可以设置为别的异常。
运行:
生成了dump文件,我们一般通过JProfiler来分析它的,dump生成一般在我们类的前几个目录:
双击它:
一般分析完就把dump删了,因为它大。