java 1.6.0_38-b05 vm 20.13-b02 GC优化手记

http://www.54chen.com/java-ee/jvm.html



基础:
业务代码
rose框架(底层是spring)
resin4
java 1.6.0_38-b05
centos

初始配置:
只修改了以下三个值
-Xmx5000M // max的heap的大小。
-Xms5000M // min的heap的大小,就是一初始给的大小,不够先GC,还不够再加,直到max。
-Xmn2000M //young区的大小,一般来讲:heap=Y+O,P是额外的值。Sun推荐Y=heap*(3/8)。

gc情况解读:
# jstat -gcutil 20538 1000 100
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 51.96 62.53 73.42 99.93 35830 1554.778 185 1089.488 2644.266
0.00 51.96 69.83 73.42 99.93 35830 1554.778 185 1089.488 2644.266
0.00 51.96 77.75 73.42 99.93 35830 1554.778 185 1089.488 2644.266
0.00 51.96 85.79 73.42 99.93 35830 1554.778 185 1089.488 2644.266
0.00 51.96 92.35 73.42 99.93 35830 1554.778 185 1089.488 2644.266

S0\S1是survivor区,就是没被gc掉的对象,在这两个survivor里来回导来导去,满足条件最后进行O区。
E是Eden区,E+S0+S1=Y。
从jstat的数据看,这个机器大概15s发生一次YGC,很长时间没有FGC了(超过1天以上),而且P区已经99.93%使用了。

各区内存情况解读:

#jmap -heap 20538
Attaching to process ID 20538, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.13-b02
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40 // 如果连40%空闲都空不出来,就需要增加heap到xmx了。
MaxHeapFreeRatio = 70  //如果70%空闲了就别折腾了,减少去xms。
MaxHeapSize      = 5242880000 (5000.0MB) -Xmx
NewSize          = 2097152000 (2000.0MB)  // -Xmn
MaxNewSize       = 2097152000 (2000.0MB)
OldSize          = 5439488 (5.1875MB)  // old区的初始大小 此默认值在32位平台上是4M,在64位平台上是5M多。基本无用。
NewRatio         = 2  //   Y/O=1/2  表示Y区要占三分之一
SurvivorRatio    = 8 //  Y区里的S与E的比例:S/E = 2/8,Y区里十分之一当S区(因为有两个S)。
PermSize         = 21757952 (20.75MB)  // P区默认配置初始值
MaxPermSize      = 85983232 (82.0MB) // P区默认配置最大值   32位的服务器时是64M,64位服务器时是64×(0.3*64) =82.2M左右。
Heap Usage:
PS Young Generation
Eden Space:
capacity = 1966604288 (1875.5MB)
used     = 968355296 (923.4955749511719MB)
free     = 998248992 (952.0044250488281MB)
49.23996667294971% used
From Space:
capacity = 64880640 (61.875MB)
used     = 32440384 (30.93756103515625MB)
free     = 32440256 (30.93743896484375MB)
50.00009864267677% used
To Space:
capacity = 65273856 (62.25MB)
used     = 0 (0.0MB)
free     = 65273856 (62.25MB)
0.0% used
PS Old Generation
capacity = 3145728000 (3000.0MB)
used     = 2375317280 (2265.279083251953MB)
free     = 770410720 (734.7209167480469MB)
75.50930277506511% used
PS Perm Generation
capacity = 80805888 (77.0625MB)
used     = 80753328 (77.01237487792969MB)
free     = 52560 (0.0501251220703125MB)
99.93495523494525% used
P区虽然显示的99%used,但是与max相比还有剩余,在spring AOP众多,一次性启动的特点下,相比82M的max,才使用到77M,还有上扬的空间。实测FGC的发生也只是一天一次。

是否需要优化判定:

YGCT/YGC=40ms  且十几秒才一次,健康

FGCT/FGC=5s  但是一天也没几次,业务允许,一般健康可优化。未来可考虑优化为多次FGC减少FGCT的时长。

后续思考:
虽然FGC并不频繁,但因为xmx值比较大,导致了O区相对变大,同时FGC缓慢,考虑从两个方向:1.调整Y区大小,让YGC去到O区的数据更少,让FGC频率更加慢(有可能很难有变化)2.调整整体的大小,让FGC频繁一点点但更加快一点 3.调整FGC的算法,让速度快一点到1秒内来。

对照组结果后续有结论了再来续本文内容。

GC优化永远是最后一项任务。


### 回答1: Java 1.6.0_20 是 Java 的一个版本,发布于2009年6月。这个版本是 Java SE 6 的更新版本之一,修复了一些之前版本的错误和漏洞。 Java 1.6.0_20 引入了一些新功能和改进,包括性能提升和更好的稳定性。它还包含了一些新的 API 和工具,以帮助开发人员更轻松地开发和调试 Java 应用程序。 在 Java 1.6.0_20 中,一些特性已经被弃用或移除,因为它们已经过时或不再被推荐使用。开发人员需要注意这些变化,并相应地修改和更新他们的代码。 此外,Java 1.6.0_20 还修复了一些安全漏洞,增强了 Java 安全性。因此,建议用户及时更新到此版本,以确保他们的应用程序能够受到更好的保护。 总的来说,Java 1.6.0_20 是 Java SE 6 的一个更新版本,它提供了性能改进、新功能、修复了错误和漏洞,并增强了安全性。对于使用 Java 的开发人员和用户来说,这个版本对于改进和保护他们的应用程序非常重要。 ### 回答2: Java 1.6.0_20是Java编程语言的版本号。1.6.0_20指的是Java 6的第20个更新版本。Java 6是由Sun Microsystems开发的一种计算机编程语言,于2006年12月发布。Java 6是Java语言的一个重要版本,引入了许多新特性和改进。 Java 6的主要特性包括: 1. 改进的性能:Java 6在性能方面进行了优化,包括JIT编译器的改进,减少了执行时间和内存占用。 2. 新的类库和API:Java 6引入了许多新的类库和API,包括脚本引擎API、归档和压缩API、调试API等,丰富了Java的功能和应用范围。 3. 数字和日期的改进:Java 6引入了新的数学库和日期、时间库,提供了更方便和准确的数字和日期处理功能。 4. 增强了安全性:Java 6在安全性方面进行了改进,加强了Java应用程序的安全性和防护措施。 5. 改进了界面和外观:Java 6引入了更好的图形界面和外观,提供了更好的用户体验。 6. 提高了多核处理器的利用率:Java 6通过使用并行处理和多线程技术,提高了多核处理器的利用率,提供了更好的性能。 总结来说,Java 1.6.0_20是Java 6的一个更新版本,它引入了许多新特性和改进,提供了更好的性能、功能和用户体验。然而,Java 6已于2013年4月停止了官方维护,并且不再推荐使用。目前,Java的最新版本是Java 17,它提供了更多的新特性和改进。因此,推荐使用最新版本的Java来进行开发和编程。 ### 回答3: Java 1.6.0_20是旧版本的Java开发工具包(Java Development Kit,JDK)。它于2010年6月发布,已过时但仍有一些人使用。这个版本的JDK是为了在计算机上运行和开发Java应用程序而设计的。 Java 1.6.0_20在其发布时提供了许多功能和改进。其中一些功能包括增强的性能、稳定性和兼容性,以及对新的硬件和操作系统平台的支持。此外,它还提供了新的开发工具、基于网络的应用程序、安全性和用户界面方面的改进。 然而,由于时间的推移,Java已经迭代更新到了更高的版本,目前最新版本为Java 17。这些新版本提供了更多的功能和改进,并修复了旧版本中的漏洞和问题。因此,建议开发者使用较新的Java版本,以获得更好的性能和安全性。 在升级到新版本之前,开发人员需要检查他们的代码是否与新版本兼容,并根据需要进行适当的更新。此外,他们还需要考虑应用程序所需的操作系统和硬件平台,并确保新版本的JDK支持这些平台。 总而言之,Java 1.6.0_20是一个旧版本的JDK,尽管它曾经提供了许多功能和改进,但现在已经过时。开发人员应该考虑升级到更高版本的Java,以获得更好的性能和安全性,并确保他们的应用程序在新环境中正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值