欢迎来到天天文库
浏览记录
ID:27803410
大小:56.00 KB
页数:7页
时间:2018-12-06
《为任务关键型java应用优化垃圾回收(上)-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、为任务关键型Java应用优化垃圾回收(上)-编程开发技术为任务关键型Java应用优化垃圾回收(上)本文由ImportNew-文学敏翻译自mgm-tp。欢迎加入翻译小组。转载谙见文末要求。目录•上篇•下篇最近,我有机会去测试并优化几个基于Java购物和门户网站程序,它们运行在Sun/Oracle的JVM上。访问量最高的几个应用在德国。在很多情况下,垃圾回收是Java服务器性能的一个关键因素。本文中,我们会研究一些先进垃圾回收算法思想以及一些重要的调节参数。我们会在各种真实场景中比较这些参数。从垃圾回收的角度來看,Java服务器程序可以冇广泛多样的需求:1.一些高流
2、量应用需要响应大量请求并创建非常多的对象。有时候,一些使用了高资源消耗框架的中等流量应用也会遇到同样的问题。总之,対垃圾回收來说,如何有效地清理这些生成的对彖是一个很大的挑战。2.另外,一些应用需要长时间运行并且在运行过程提供稳定的服务,要求性能不会随着吋间而慢慢变差或者突然恶化。3.某些场景需要严格限制用户响应时间(比如网络游戏或者投注应用等),儿乎不允许额外的GC暂停。在很多场景中,你可以通过不同的优先级将儿种需求结合起来。我的儿个样例程序对第一点要求比第二点要高很多,但是绝大部分程序不会同吋对这三方面要求都高。这给你留下了足够权衡的空间。默认配置下JVMG
3、C的性能JVM有很多改进,但仍然不能在程序运行时对任务做优化。除了上面提到的三点,默认的JVM设置还有一个优先级仅次于它们的需求:减小内存山用。考虑到成千上万的用户并不是在内存充足的服务器上运行。对很多电子商务产品也很重要,因为这些应用大部分时间被配置在开发笔记本上运行,而不是在商用服务器上。因此,如果你的服务器配置着最小的堆空间和GC参数,比如下面这样配置,java-Xmx1024m-XX:MaxPermSize=256m-cpPortal,jarmy.portal.Portal这样肯定会导致系统运行不够高效。首先,好的做法不仅配置内存最大限制,也需要配置初始
4、内存大小,以避免服务器在启动过程中逐步增加内存。否则代价会很大。当知道服务器需要多少内存吋(你应该及吋地查明),最好将初始内存大小与最大内存设置相等。可以通过以下JVM参数來设置:-Xms1024m-XX:PcrmSizc=256m最后一个经常在JVM配置的基本选项是配置新生代堆内存大小,与上面设置的方式类似:-XX:NewSize二200m-XX:MaxNewSize二200m下面的章节会对上面的配置以及更复杂的配置给岀解释。首先,让我们看一个门户网站的应用,它运行在一台相当慢的测试主机上。当进行负载测试时,它的垃圾回收是怎么工作的:图1堆大小稍微优化后的JV
5、M在25小时左右的GC行为(-Xms1024m-Xmx1024m-XX:NewSize=200m-XX:MaxNewSize=200m)其中,蓝色的曲线农示总的堆内存占用量随时间的变化,垂宜的灰色线条农示GC暂停的间隔。除了曲线图,GC操作的关键指标和性能显示在最右边。首先我们看一卜•在这次测试屮,垃圾被创建(和回收)的平均量。30.5MB/s的数值被标为黄色,因为这是一个相当大但还可以的垃圾主成速率,对一个引导性的GC调优例子而言还算可以。其他值表示JVM在清理这些垃圾吋的表现:99.55%的垃圾是在新生代屮被清理的,老年代的只占0.45%O这个结果相当不错,
6、因此标为绿色。Z所以有这样的结果,可以从GC引入的暂停间隔看出來(以及处理用户请求的工作线程):冇很多但很短暂的新生代GC间隔,平均每6s—次,持续时间不会超过50ms。这些暂停使JVM停止运行的时间占总时间的0.77%,但是毎次暂停对等待服务器响应的用户来说完全感觉不到。另一方面,老年代GC的暂停只占总时间的0.19%o但是,在这段时间内老年代GC只清理了0.45%的垃圾,而新生代GC用占0.77%的时间清理了99.55%的垃圾。可见,与新生代GC相比,老年代GC是多么低效。另外,老年代GC的暂停平均触发速率不到一个小时一次,但平均持续时间可达到8s,最大异常
7、值甚至达到19s。由于这些暂停会真正地停止JVM处理用户请求的线程,因此暂停应尽量不频发且持续时间短。通过以上观察可以得出分代垃圾回收的基木调优目标:•新生代GC尽量回收多的垃圾,避免老年代GC频发H持续时间较短。分代垃圾回收的基本思想与堆内存大小调整先从下图开始。这个图可以通过JDK工具得到,比如jstat或者jvisualvm以及它的visualgc插件:图2JVM的堆内存结构,包括新生代的子分区(最左列)Java的堆内存曲永久代(Perm),老年代(Old)和新生代(NeworYoung)组成。新生代进一步划分为一个Eden空间和两个Survivor空间S
8、O、SI。Eden空间是
此文档下载收益归作者所有