jvm与GC 基本 三

转载请注明出处,谢谢。

通过GC使对象在各个内存区内迁移。

GC的种类:
Minor GC:新生代GC,指发生在新生代的垃圾收集动作,所有的Minor GC都会触发全世界的暂停(stop-the-world),停止应用程序的线程,不过这个过程非常短暂。
Major GC/Full GC:老年代GC,指发生在老年代的GC。

GC触发条件:Eden区满了触发Minor GC,这时会把Eden区存活的对象复制到Survivor区,当对象在Survivor区熬过一定次数的Minor GC之后,就会晋升到老年代(当然并不是所有的对象都是这样晋升的到老年代的,但对象过大时,直接放到老年代里),当老年代满了,就会报OutofMemory异常。

jvm 的一些简单配置参数。

-XmxXms
指定最大堆和最小堆
-Xmn
设置新生代大小
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久区)的比值
值为4 表示 新生代:老年代=1:4,即年轻代占堆的1/5
-XX:SurvivorRatio
设置两个Survivor区和eden的比

官方推荐新生代占堆的3/8
幸存代占新生代的1/10

设置 JVM 参数为 -XX:+PrintGCDetails,使得控制台能够显示 GC 相关的日志信息,执行代码,下面是执行的结果。

-XX:+PrintGCDetails 

使用上面可以看到详细的jvm内存使用情况

我们可以写个简单使用配置看下
如用下面的代码

public static void main(String[] args) {
   byte[] b=null;
   for(int i=0;i<10;i++)
       b=new byte[1*1024*1024]; //每次 1M
}

jvm 配置

第一种情况

-Xmx20m -Xms20m -Xmn1m  -XX:+PrintGCDetails

这里写图片描述

没有触发GC
全部分配在老年代(tenured) used 10240K 用了10M.
因为你的 -Xmn1m 新生代 只有1M 放不下,一个对象都放不下,所以直接放到了 老年代。

第二种情况

如果还是上面的代码 但是参数变了,新生代的大小变为 15M了。

-Xmx20m -Xms20m -Xmn15m  -XX:+PrintGCDetails

这里写图片描述

没有触发GC
全部分配在eden
老年代没有使用

第三种情况

但是如果 新生代 能放一部分的对象呢,我们可以改参数试试。
代码还是和上面的一样

-Xmx20m -Xms20mXmn7m  -XX:+PrintGCDetails

这里写图片描述

进行了2次新生代GC,占用了一部分老年代。

jvm 可配置的参数选项可以参考 Oracle 官方网站给出的相关信息:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
下面只列举其中的几个常用和容易掌握的配置选项

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值