学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢。
尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)
OOM
堆空间溢出,存放数据大于堆空间大小。
package com.hut.djh;
import java.util.ArrayList;
import java.util.Random;
/**
* @Author: 秃头不用洗发水
* @Date: 2021-02-23
* @Description: OOM
* -Xms600m -Xmx600m 设置起始和最大内存
*/
public class Test4 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
while(true){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(new picture(new Random().nextInt(1024*1024)));
}
}
}
class picture{
private byte[] pictures;
public picture(int len){
this.pictures = new byte[len];
}
}
设置虚拟机大小
在cmd中,使用jvisualvm 打开 Java VisualVM 提前安装插件gc,用于观察。
运行代码。
老年代和伊甸园区和一个幸存者区满了,即OOM。
可以观察运行情况。
年轻代、老年代
生命周期划分。
链接操作的对象,生命周期会比较长。
伊甸园区:对象最先创建对象的位置。
幸存者区:没有消亡的对象,就幸存下来,在幸存者区。
经过一定gc后,放入老年代。
声明周期长的对象多,可以把老年代设置大一点。
新生代:老年代默认比例 = 1:2
伊甸园区:幸存者区 = 8:1:1
(但实际使用不是8:1:1,存在自适应内存分配机制,可以关闭或者显式设置比例)
当-Xmn和-XX:NewRatio 两者同时使用时,以-Xmn为主。