JVM 年轻代和年老代 大小设置
有许多现成的调优经验的介绍。Charlie Hunt写的《Java Performance》一书里有很详细的介绍。中文版就快出了,敬请关注。
其中涉及GC调优的部分在过往的JavaOne里也有session介绍过。请搜这个标题:"Step-by-Step: Garbage Collection Tuning in the Java HotSpot™ Virtual Machine" 不过那种很具体的现成经验毕竟是别人在他们见过的环境里沉淀下来的,并不一定适用于所有情况。所以怎样的调优方法适合自己,还是得理解了系统底层的工作原理然后再在实际环境里加以应用、变通才好。 对HotSpot VM里的GC不熟悉的,至少应该把Sun以前出的HotSpot VM的GC调优白皮书读了。 ==================== 为啥HotSpot VM里收集有两种概念,一种是young GC/minor GC,另一种是full GC/major GC;为啥后者不是叫old GC?
CMS在并发模式工作的时候是只收集old gen的。但一旦并发模式失败(发生concurrent mode failure)就有选择性的会进行全堆收集,也就是退回到full GC。 ==================== 大小分配怎样才合理取决于某个具体应用的对象的存活模式。 这涉及到分代式GC的原理。最初为何要把GC堆划分为多个区域,以不同的频率来收集它们?本来就是为了让每次收集的效率都最大(在收集的区域里尽可能回收出可用空间)。如果一个应用里对象的存活模式满足弱分代假设,那么把新生对象放在同一个区域里,每次收集这个区域的效率都应该比较高(因为假设是新生对象活不了多久就死了)。 有人专门研究这个。可以用"java object demography"这组关键字来搜已有资料。 ==================== 举例:可能很多人都有一种印象,young gen应该比old gen小。笼统说确实如此,因为在最坏情况下young gen里可能所有对象都还活着,而如果它们全部都要晋升到old gen的话,那old gen里的剩余空间必须能容纳下这些对象才行,这就需要old gen比young gen大(否则young GC就无法进行,而必须做full GC才能应付了)。 许多Web应用里对象会有这样的特征: 如果是这样的模式,那young gen可以设置得非常大,大到每次young GC的时候里面的多数对象(b)最好已经死了。 那old gen怎么办?如果是上面说的情况,那old gen至少要足以装下所有长期存活的对象(a);同时也要留出一定的余地用来容纳young GC没能清理掉的临时对象。 这样,最后调整出来的结果很可能young GC反而比old gen大许多。这完全没问题。 只有(a)和(b)的话就完美了,现实中最头疼的就是针对(c)对象的调优。它们或许会经历多次young GC之后仍然存活,于是晋升到old gen;但晋升上去之后或许很快就又死掉了。 ================= 知道了原理之后在现实中要如何实践呢? 首先得了解硬性限制:某个服务器总共有多少内存,其中最多可以分配多少给某个应用程序;有没有一些服务对响应时间有严格要求,有的话限制是多少,之类的。 然后看看应用的特征是怎样的。可以借助一些工具来了解对象的存活情况,例如NetBeans的profiler就有这样的功能(老文档);许多其它主流Java profiler也有类似的功能。 情况了解清楚了就可以开始迭代调整各种参数看实际运行的表现如何。迭代到满意为止。 ================= 那个…上面随便写了些。文字不通顺的地方请轻拍,要整理成“文章”的话又要烧脑细胞了… 没说清楚的地方请另外补充背景知识… |
|
原文地址:http://blog.sina.com.cn/s/blog_4adc4b090102vr1v.html
JVM 年轻代和年老代 大小设置相关推荐
- JVM分化回收机制(年轻代、年老代、永久代)
分代回收机制:JVM将堆内存划分为Eden.Survivor和Tenured/Old空间. (Minor GC )年轻代 :Eden.Survivor.尽可能快的收集生命周期短的对象. 在年轻代中经历 ...
- java年轻代和年老代默认比值_JAVA中的GC以及年轻代,年老代,持久代的认识
java中我们常常谈论到垃圾回收机制,那么,垃圾回收机制又是什么呢?说到JVM调优,似乎很高大上,那么JVM调的都是那些数据呢?伊甸园区,幸存区,年轻代,年老代,持久代,每个词都熟悉又陌生,似乎很深奥 ...
- Jave虚拟机划分的三个代: 年轻代、年老代和持久代
转载自:点击打开链接 虚拟机中的共划分为三个代: 年轻代(Young Generation).年老代(Old Generation)和持久代(Permanent Generation).其中持久代主 ...
- 年轻代、年老代和持久代
年轻代(Young Generation).年老代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的J ...
- Java 年轻代、年老代、GC
一篇关于gc的文章 http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html 自己的笔记: JVM是用c语言写的.一般说的JVM是 ...
- 是堆内存分为年轻代和年老代!!!
1.是堆内存分为年轻代和年老代!!! 2.是堆内存分为年轻代和年老代!!! 3.是堆内存分为年轻代和年老代!!! 4. 1) 在Young Generation中,有一个叫Eden Space的空间, ...
- 内存管理_分代机制(年轻代、年老代、永久代)
通用的分代垃圾回收机制 分代垃圾回收机制,是基于这样一个事实,不同的对象的生命周期是不一样的.因此,不同的生命周期的对象可以采用不同的回收算法,便以提高回收效率,我们将对象分为三种状态:年轻代.年老代 ...
- 年轻代和年老代分配过大 或 过小
我们都知道 堆内存被分为年轻代 和 年老代 ,默认比例是1:2. 年轻代占1/3. 年轻代 gc使用的算法是 copy算法(速度快,但是会浪费一个survivor内存),年老代使用的是 标记整理算法( ...
- jvm 年轻代、年老代、永久代
关键字约定 Young generation –>新生代 Tenured / Old Generation –>老年代 Perm Area –>永久代 年轻代: 所有新生成的对象首先 ...
- JVM的年轻代、年老代(老年代)和永生代(持久代)【Loadrunner性能调优】
1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
最新文章
- 软件调试修炼之道之——反思
- Cassandra 数据模型设计,根据你的查询来制定设计——反范式设计本质:空间换时间...
- 【分享】怎样学习一门新技术?
- 使用Spring 3引导Web应用程序
- Javascript模拟c#中arraylist操作(学习分享)
- Raid技术精简总结
- [POI2004]GRA
- 程序员的代码为什么永远写不完?
- 详述 ISC BIND 服务器中的信息泄露漏洞
- Android 实现 相机、相册功能 + 图片存取数据库操作
- j2me解决模拟器乱码
- cocos creator性能优化合集
- AVR单片机开发11——1602液晶屏幕
- leetcode笔记(五)809. Expressive Words
- 使用js脚本实现网页版微信定时发送信息
- 对话论答创始人王枫:“TAD”战法布局AI教育 让每个孩子都能享受优质教育
- 狄拉克函数- dirac 分布
- 软件测试面试前必备题库(必备理论基础复习)
- android 发短信 oppo,oppo手机怎么自动回复短信?oppo手机自动回复信息设置教程
- 报表导出HTML格式怎么转换为EXCEL,使用html导出excel时的格式问题
热门文章
- 求树的直径的两种方法
- c语言规定 标识符由,【填空题】C语言的标识符命名规则规定标识符可以由字母数字和下划线组成,首字符不能是 。 (4.0分)...
- [转]sed命令详解
- 技术分享 | 无人机仿真教程-Prometheus平台 -转自阿木实验室
- 单目标优化算法测试函数python绘制及相关代码
- C语言中的字符串与字符串函数
- vue3源码系列之计算属性computed原理剖析
- Gerrit的安装和配置个人经验总结
- 2.H.265/HEVC —— 帧内预测
- Excel VBA初级系列培训--课时1