老卫带你学—jvm的新生区,永久区,堆内存调优
新生区
- 类:诞生和成长的地方,甚至死亡
- 伊甸区:所有的对象都是在伊甸区new出来的
- 幸存者区(0,1)
例图,假如Eden区域可以放10个对象,当Eden区域满的时候,进行一次轻GC,此时假设有一个对象到了service 0区域。如果service 0 区域也满了,那么就会调用一次重GC,将对象放入老年代中。
但是,如果新生代与老年代区域都满了,那么就会报OOM错误
永久区
永久代区域常驻内存,用来存放jdk自身携带的Class对象,以及java运行时的一些环境或类信息。这个区域不存在垃圾回收,关闭jvm虚拟机就会释放这个区域的内存
- jdk1.6之前:永久代
- jdk1.7 :永久代,但是慢慢退化,去永久代,常量池在堆中
- jdk1.8之后,无永久代,常量池在元空间
堆内存调优
可以通过如下语句查看jvm内存
默认情况系:分配的总内存是电脑的1/4,而初始化的内存是1/64
如果出现OOM错误,代表堆内存不够,这时候我们可以通过调整堆内存大小,来进行堆内存的调优
-Xms 1024m
-Xmx 1024m
-XX:PrintGCDetails
我们也可以使用JProfile来进行,错误定位,进而对该部分的代码进行优化
jprofile的作用:
- 分析dump内存文件,快速定位内存问题
- 获得堆中的数据
- 获得大的对象