jvm java虚拟机 新生代的配置
1.1.1.1. -Xmn参数
参数-Xmn1m可以用于设置新生代的大小。设置一个较大的新生代会影响老生代的大小,因为这两者的总和是一定的,这个系统参数对于系统性能以及GC行为有很大的影响,新生代一般设置为整个堆空间的1/3到1/4左右最合适。
参数-XX:SurvivorRatio用来设置新生代中eden空间和from/to空间的比例,公式如下:
-XX:SurvivorRatio=eden/from =eden/to
解释:from和to之间的两块区间内存是相等的。可以参考
java虚拟机 jvm java堆 方法区 java栈这篇文章,下面的输出也会印证from和to之间的两块区间内存是相等的。
使用不同的堆分配参数确实有很大的影响,下面开始验证影响。
下面代码是循环十次每次申请1M的空间一共申请10M,代码如下:
byte[] b = null;
for (int i = 0; i < 10; i++) {
b = new byte[1 * 1024 * 1024];
}
1.1.1.2. 第一种情况:-Xmx20m -Xms20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
配置上面的参数程序的输出如下:
[GC [DefNew: 512K->256K(768K), 0.0010949 secs] 512K->377K(20224K), 0.0011182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 768K, used 488K [0x335d0000, 0x336d0000, 0x336d0000)
eden space 512K, 45% used [0x335d0000, 0x3360a2e0, 0x33650000)
from space 256K,100% used [0x33690000, 0x336d0000, 0x336d0000)
to space 256K, 0% used [0x33650000, 0x33650000, 0x33690000)
tenured generation total 19456K, used 10361K[0x336d0000, 0x349d0000, 0x349d0000)
the space 19456K, 53% used [0x336d0000, 0x340ee730, 0x340ee800, 0x349d0000)
compacting perm gen total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)
the space 12288K, 1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)
ro space 10240K, 45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)
rw space 12288K, 54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)
设置的eden与from的比例是2:1
from=to 这里前面说过,输出也确实证明是相等的。所以eden为512K,新生代我们分配的是1M=512K+256K+256k=1024K=1M,总的可用的新生代为512K+256K=768K;
由于新生代的eden区域的内存为512K,我们每次申请的空间是1M,所以没有办法容纳,因此触发了一次GC垃圾回收,对eden区域的内存进行了部分的回收,新生代没有内存容纳1M的内存还是不够存储,所以数组都被分配到老生代,老生代最终占用了10361K空间。
1.1.1.3. 第二种情况:-Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
第二种情况将新生代内存扩大到7M,输出如下:
[GC [DefNew: 2795K->1498K(5376K), 0.0018315 secs] 2795K->1498K(18688K), 0.0018637 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 4687K->1024K(5376K), 0.0011140 secs] 4687K->1498K(18688K), 0.0011327 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 4125K->1024K(5376K), 0.0004712 secs] 4599K->1498K(18688K), 0.0004903 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 5376K, used 3163K [0x335d0000, 0x33cd0000, 0x33cd0000)
eden space 3584K, 59% used [0x335d0000, 0x337e6d38, 0x33950000)
from space 1792K, 57% used [0x33b10000, 0x33c10010, 0x33cd0000)
to space 1792K, 0% used [0x33950000, 0x33950000, 0x33b10000)
tenured generation total 13312K, used 474K[0x33cd0000, 0x349d0000, 0x349d0000)
the space 13312K, 3% used [0x33cd0000, 0x33d468e0, 0x33d46a00, 0x349d0000)
compacting perm gen total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)
the space 12288K, 1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)
ro space 10240K, 45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)
rw space 12288K, 54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)
在这个参数下eden的内存为次GC垃圾回收,因为程序申请内存的时候,变量失去了上一次的引用指针。所以是在新生代中进行GC垃圾回收。最终的结果:所有的内存都被分配到新生代进行,通过GC保证了新生代有足够的空间存储。而没有进入老年代,只是在GC过程中,部分新生对象晋升到老年代。
1.1.1.4. 第三种情况:-Xmx20m -Xms20m -Xmn15m -XX:SurvivorRatio=8 -XX:+PrintGCDetails
第三种情况将新生代内存扩大到15M,输出如下:
Heap
def new generation total 13824K, used 11223K [0x335d0000, 0x344d0000, 0x344d0000)
eden space 12288K, 91% used [0x335d0000, 0x340c5f50, 0x341d0000)
from space 1536K, 0% used [0x341d0000, 0x341d0000, 0x34350000)
to space 1536K, 0% used [0x34350000, 0x34350000, 0x344d0000)
tenured generation total 5120K, used 0K[0x344d0000, 0x349d0000, 0x349d0000)
the space 5120K, 0% used [0x344d0000, 0x344d0000, 0x344d0200, 0x349d0000)
compacting perm gen total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)
the space 12288K, 1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)
ro space 10240K, 45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)
rw space 12288K, 54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)
在这次的测试中,新生代被分配15M内存,eden的内存是12288K,所有这个区域完全可以容纳10M的内存数组,所以所有的分配都是在eden直接进行,并没有触发GC垃圾回收,因此from/to和老年代tenured使用率都是0.
通过上面的例子,发现不同的堆分配策略对系统执行的影响还是很大。所以在实际开发中,还是要合理的设置值,基本策略:尽可能将对象预留在新生代,减少老年代GC次数。(第一种情况对象都被分配到老年代,老年代肯定要进行GC垃圾回收)
1.1.1.5. -XX:NewRatio参数
-XX:NewRatio参数主要设置新生代和老年代的比例。公式如下:
-XX:NewRatio=老年代/新生代
1.1.1.6. 第四种情况:-Xmx20m -Xms20m -XX:NewRatio=2 -XX:+PrintGCDetails
第四种参数设置为:-Xmx20m -Xms20m -XX:NewRatio=2 -XX:+PrintGCDetails 程序的输出如下:
[GC [DefNew: 4899K->474K(6144K), 0.0016090 secs] 4899K->1498K(19840K), 0.0016426 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew: 5768K->0K(6144K), 0.0011308 secs] 6792K->2522K(19840K), 0.0011490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 6144K, used 1134K [0x335d0000, 0x33c70000, 0x33c70000)
eden space 5504K, 20% used [0x335d0000, 0x336eb8c8, 0x33b30000)
from space 640K, 0% used [0x33b30000, 0x33b30088, 0x33bd0000)
to space 640K, 0% used [0x33bd0000, 0x33bd0000, 0x33c70000)
tenured generation total 13696K, used 2522K [0x33c70000, 0x349d0000, 0x349d0000)
the space 13696K, 18% used [0x33c70000, 0x33ee6878, 0x33ee6a00, 0x349d0000)
compacting perm gen total 12288K, used 146K [0x349d0000, 0x355d0000, 0x389d0000)
the space 12288K, 1% used [0x349d0000, 0x349f4a58, 0x349f4c00, 0x355d0000)
ro space 10240K, 45% used [0x389d0000, 0x38e59b28, 0x38e59c00, 0x393d0000)
rw space 12288K, 54% used [0x393d0000, 0x39a5d0e8, 0x39a5d200, 0x39fd0000)
因为堆空间分配的内存为20M,老年代和新生代比例我们设置的是2:1,所以新生代的内存大约是6144K 老年代的内存是13696K。由于新生代Gc的时候,from/to的内存容纳不下任何一个1m数组对象,影响了新生代的正常回收,所以对象都跑到老年代空间了。因此导致两个1MB数组进入老年代,(新生代GC,还有1M数组幸存,按理说应进入from/to但是from/to只有640K空间不足)
注意:
-XX:SurvivorRatio可以设置eden区与Survivor区比例,-XX:NewRatio可以设置老年代新生代的比例。
完成的公式如下图所示:
jvm java虚拟机 新生代的配置的更多相关文章
- 从头捋捋jvm(-java虚拟机)
jvm 是Java Virtual Machine(Java虚拟机)的缩写,java 虚拟机作为一种跨平台的软件是作用于操作系统之上的,那么认识并了解它的底层运行逻辑对于java开发人员来说很有必要! ...
- (转)JVM——Java虚拟机架构
背景:最近开始忙着找工作了,把需要储备的知识再整理总结一遍!关于JVM的总结,是转自下面的连接.结合<深入理解java虚拟机>,看起来有更清晰的认识. 转载自:http://blog.cs ...
- JVM——Java虚拟机架构
0. 前言 Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性. 平台无关性原理:编译后的 Java程序(.class文件)由 JVM执行.JVM屏蔽 ...
- JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)
作者:请叫我红领巾,转载请注明出处http://www.cnblogs.com/xxzhuang/p/7453746.html,简书地址:http://www.jianshu.com/p/b963b3 ...
- 深入了解JVM(Java虚拟机)
虚拟机 JRE由Java API和JVM组成,JVM通过类加载器(Class Loader)加类Java应用,并通过Java API进行执行. 虚拟机(VM: Virtual Machine)是通过软 ...
- 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略
身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...
- JVM - Java虚拟机规范官方文档
Java虚拟机规范官方文档
- java 虚拟机--新生代与老年代GC [转]
原文链接:http://www.360doc.com/content/12/1023/16/9615799_243296263.shtml 1. Java堆中各代分布: 图1:Java堆中各代分布 Y ...
- java 虚拟机--新生代与老年代GC
Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的. Method area: JVM只有一个为所有的线程所共享的方法区.它存储类结构,例如运行时常量池,成员和方法数据 ...
随机推荐
- [HAOI 2007]上升序列
Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...
- Codeforces Round #460 D. Karen and Cards
Description Karen just got home from the supermarket, and is getting ready to go to sleep. After tak ...
- ●SPOJ 7258 Lexicographical Substring Search
题链: http://www.spoj.com/problems/SUBLEX/题解: 后缀自动机. 首先,因为相同的子串都被存在了自动机的同一个状态里面,所以这就很自然的避免了重复子串的问题. 然后 ...
- HDU2425:Hiking Trip(BFS+优先队列)
给出一个地图,地图有四种路面,经过每种路面花费的时间不同,问从起点到终点所花费的最少时间是多少 把到各个点的花费存入队列中,然后弹出,即可得到最小 Sample Input 4 6 1 2 10 T. ...
- [USACO 5.1.3]乐曲主题
Description 我们用N(1 <= N <=5000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,每个数表示钢琴上的一个键.很不幸这种表示旋律的方法忽略了音符的 ...
- bzoj 2004: [Hnoi2010]Bus 公交线路
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...
- UVA 3713 Astronauts
The Bandulu Space Agency (BSA) has plans for the following three space missions: • Mission A: Landin ...
- [Project] Simulate HTTP Post Request to obtain data from Web Page by using Python Scrapy Framework
1. Background Though it's always difficult to give child a perfect name, parent never give up trying ...
- P2P技术详解(一):NAT详解——详细原理、P2P简介
1. IPv4协议和NAT的由来 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联网发 ...
- 从JVM角度看i++ 与++i
1.i++和++i的问题 反编译结果为 Code: 0: iconst_1 1: istore_1 2: iinc 1, 1 //这个个指令,把局部变量1,也就是i,增加1,这 ...