赞
踩
堆是GC(垃圾收集器)执行垃圾回收的重点区域, 所以今天我们着重讲下堆内存
自己的项目,如果出现OOM或者出现内存泄露,一定是出在堆内存上,因为堆是JVM中最大的一块内存空间,所有线程共享Java堆,物理上不连续的逻辑上连续的内存空间,几乎所有的实例都在这里分配内存,在方法结束后,堆中的对象不会马上删除,仅仅在垃圾收集的时候被删除
堆的内存结构如下:
如果把JVM的堆 划分区间展开来说, 就是下面的图
Java7及以前将堆空间逻辑上分成三部分:
Java8及以后将堆内存逻辑上分为:
为什么根据对象要分代 ?
将对象根据存活概率进行分类,对存活时间长的对象,放到固定区,从而减少扫描垃圾时间及GC频率。针对分类进行不同的垃圾回收算法,对算法扬长避短。
具体怎么分代?
JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)
为什么survivor分为两块相等大小的幸存空间?
主要为了解决碎片化。如果内存碎片化严重,也就是两个对象占用不连续的内存,已有的连续内存不够新对象存放,就会触发GC
怎么确定对象的归属哪一代
参数示例 | 描述说明 |
---|---|
-verbose:gc | 控制台打印GC参数,一般都是自己测试时候用控制台输出 |
-XX:+PrintGCDetails | 触发GC时日志打印详细, 适合 线上,正式服务器打印gc日志 |
-Xms20M | 初始堆大小 20M |
-Xmx20M | 最大堆大小20M 一般情况下-Xms和-Xmx这两个值设为相同大小 |
-Xmn10M | 新生代最大可用值10M, !!!注意采用 G1收集器不设置该参数 |
-XX:+PrintGC | 触发GC时日志打印 |
-XX:SurvivorRatio=8 | eden:from:to =8:1:1 也就是可用的也就90% |
-XX:+HeapDumpOnOutOfMemoryErro | OOM时生成Dump文件 dump文件便于我们分析oom |
-XX:NewRatio=2 | 新生代:老年代 = 1:2 |
有这这些参数,我们就可以在用用程序中配置JVM参数,从而得到我们想要的jvm配置,出了问题的时候也能够很快的定位问题
设置JVM运行参数
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGC -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:SurvivorRatio=8
下一篇,我们着重讲下 对内存的垃圾回收算法, 到底什么算堆内的垃圾对象, 垃圾到底是怎么被jvm回收的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。