【JVM学习笔记】内存分配

堆内存区域划分(JDK1.7)

 

内存分配策略

1、对象优先分配到eden

2、大对象直接分配到老年代

3、长期存活的对象分配到老年代

4、空间分配担保(内存不够去别的地方借)

5、动态对象年龄判断

 

虚拟机参数:

-verbose:gc 输出虚拟机GC信息

-XX:+PrintGCDetails 打印GC详细信息

-XX:+UseSerialGC 使用Serial收集器

-Xms20M -Xmx20M

-Xmn10M 指定新生代内存

-XX:SurvivorRatio=8 指定eden区域的比例

 

Minor GC和Full GC的触发条件

Minor GC:当Eden区满时触发。

Full GC

1、调用System.gc()系统建议执行Full GC,但不是必然执行、

2、老年代空间不足、

3、方法区空间不足、

4、通过Minor GC后进入老年代的平均大小大于老年代的可用内存

5、由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

 

大内存直接进入老年代

-XX:PretenureSizeThreshold 设置老年代的大小

 

长期存活的对象将进入老年代

-XX:MaxTenuringThreshold 默认15

age 进入 eden初始为1,每经历一次垃圾回收,age+1

 

空间分配担保

当新生代内存不够用,借用老年代进行空间分配担保,虚拟机默认启用。

Minor GC之前虚拟机会检查老年代最大可用连续空间是否大于新生代所有对象总空间,如果成立,Minor GC可以确保是安全的。若不成立,查看是否设置参数允许担保失败,如果允许,则检查老年代最大连续可用空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管是有风险的;如果小于或者参数设置不允许冒险,那就要进行一次Full GC了。

也要保证老年代能够容纳对象大小

-XX:+HandlePromotionFailure 开启

-XX:-HandlePromotionFailure 禁用(减号)

 

动态对象年龄判断

虚拟机并不是永远要求对象达到设定的年龄才能晋升到老年代,如果Survivor空间中相同年龄所有对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代了。

 

Minor GC和Full GC区别:

新生代GC:Minor GC是指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常的频繁,一般回収速度也比较快。

老年代GC:Full GC或Major GC是指发生在老年代的GC,出现本GC通常会伴随至少一次Minor GC(但非绝对),Full GC的速度一般会比Minor GC慢10倍以上。

 

逃逸分析与栈上分配

逃逸:是指在某个方法之内创建的对象,除了在方法体之内被引用之外,还在方法体之外被其它变量引用到;这样带来的后果是在该方法执行完毕之后,该方法中创建的对象将无法被GC回收,由于其被其它变量引用。正常的方法调用中,方法体中创建的对象将在执行完毕之后,将回收其中创建的对象;故由于无法回收,即成为逃逸。

栈上分配:主要是指在Java程序的执行过程中,在方法体中声明的变量以及创建的对象,将直接从该线程所使用的栈中分配空间。 一般而言,创建对象都是从堆中来分配的,这里是指在栈上来分配空间给新创建的对象。

-XX:+DoEscapeAnalysis 是否打开逃逸分析依赖于以下JVM的设置

 

JDK1.8的变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值