《深入理解JVM》之JVM堆内存

JVM堆内存分为2块 : Permanent Space和Heap Space
Permanent即持久代,主要存放java类定义信息,与垃圾回收器要收集的java对象关系不大。用于存放静态类型数据,如 Java Class, Method 等。但是有些应用可能动态生成或者调用一些Class,这时候需要设置一个比较大的持久代空间来存放这些运行中动态增加的类型。

Heap={Old+New={Eden,from,to}},old即年老代,New即年轻代。年老代和年轻代的划分对垃圾收集影响比较大。
针对年轻代的垃圾回收即Young GC 年轻代一般分为三个区:1个Eden区,2个Survivor区
针对年老代的垃圾回收即Full GC
所有新生成的对象首先放在年轻代,年轻代的目标尽可能收集生命周期短的对象。
在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

所以,当一组对象生成时,内存申请过程如下:
1.JVM会试图为相关Java对象在年轻代的Eden区中初始化一块内存区域。
2.当Eden区空间足够时,内存申请结束。否则执行下一步。
3.JVM试图释放在Eden区中所有不活跃的对象(Young GC)。释放后若Eden空间仍然不足以放入新对象,JVM则试图将部分Eden区中活跃对象放入Survivor区。
4.Survivor区被用来作为Eden区及年老代的中间交换区域。当年老代空间足够时,Survivor区中存活了一定次数的对象会被移到年老代。
5.当年老代空间不够时,JVM会在年老代进行完全的垃圾回收(Full GC)。
6.Full GC后,若Survivor区及年老代仍然无法存放从Eden区复制过来的对象,则会导致JVM无法在Eden区为新生成的对象申请内存,即出现“Out of Memory”。

OOM(Out Of Memery)异常主要有以下2种原因
1、年老代溢出 java.lang.OutOfMemoryError:Javaheapspace
产生原因:设置的内存参数Xmx过小或者程序的内存泄漏及使用不当
例如:循环上万次的字符串处理,创建上万个对象,在一段代码内申请上百M甚至上G内存

2、持久代溢出 java.lang.OutOfMemoryError:PermGenspace
由于持久代设置过小,动态加载了大量Java类而导致溢出
解决方法:将参数 -XX:MaxPermSize 调大(一般256m能满足绝大多数应用程序需求)。将部分Java类放到容器共享区

JVM初始内存的分配由-Xms指定,默认为物理内存的1/64但小于1G
最大内存的分配由-Xmx指定,默认为物理内存的1/4但小于1G
-XX:NewRatio=参数 设置young与old的比例大小。
-XX:SurvivorRatio=参数 设置Eden与Survivor的比例大小,默认为32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值