1. WAS85
Java version = 1.6.0, Java Compiler = j9jit24, Java VM name = IBM J9 VM
native_stderr.log
<exclusive-start id="245" timestamp="2013-12-05T10:20:14.005" intervalms="972.968"> <response-info timems="0.106" idlems="0.043" threads="2" lastid="00000000055FD400" lastname="Thread-63" /> </exclusive-start> <sys-start id="246" timestamp="2013-12-05T10:20:14.006" intervalms="67992.904" /> <cycle-start id="247" type="global" contextid="0" timestamp="2013-12-05T10:20:14.006" intervalms="67992.968" /> <gc-start id="248" type="global" contextid="247" timestamp="2013-12-05T10:20:14.006"> <mem-info id="249" free="2960578296" total="3883859968" percent="76"> <mem type="nursery" free="1086533864" total="1943994368" percent="55" /> <mem type="tenure" free="1874044432" total="1939865600" percent="96"> <mem type="soa" free="1777051152" total="1842872320" percent="96" /> <mem type="loa" free="96993280" total="96993280" percent="100" /> </mem> <remembered-set count="47106" /> </mem-info> </gc-start> <allocation-stats totalBytes="621116312" > <allocated-bytes non-tlh="884520" tlh="620231792" /> <largest-consumer threadName="server.startup : 0" threadId="0000000002339C00" bytes="377686264" /> </allocation-stats> <gc-op id="250" type="mark" timems="94.247" contextid="247" timestamp="2013-12-05T10:20:14.100"> <trace-info objectcount="5199694" scancount="4506484" scanbytes="168363188" /> <finalization candidates="1935" enqueued="311" /> <ownableSynchronizers candidates="17145" cleared="3152" /> <references type="soft" candidates="81595" cleared="0" enqueued="0" dynamicThreshold="31" maxThreshold="32" /> <references type="weak" candidates="74619" cleared="3522" enqueued="1751" /> <references type="phantom" candidates="1044" cleared="30" enqueued="30" /> <stringconstants candidates="110958" cleared="8756" /> </gc-op> <gc-op id="251" type="classunload" timems="0.264" contextid="247" timestamp="2013-12-05T10:20:14.100"> <classunload-info classloadercandidates="515" classloadersunloaded="2" classesunloaded="0" quiescems="0.000" setupms="0.066" scanms="0.187" postms="0.011" /> </gc-op> <gc-op id="252" type="sweep" timems="3.781" contextid="247" timestamp="2013-12-05T10:20:14.104" /> <gc-end id="253" type="global" contextid="247" durationms="99.010" timestamp="2013-12-05T10:20:14.105"> <mem-info id="254" free="3641999632" total="3883859968" percent="93"> <mem type="nursery" free="1759178952" total="1943994368" percent="90" /> <mem type="tenure" free="1882820680" total="1939865600" percent="97"> <mem type="soa" free="1785827400" total="1842872320" percent="96" /> <mem type="loa" free="96993280" total="96993280" percent="100" /> </mem> <pending-finalizers system="298" default="13" reference="1781" classloader="0" /> <remembered-set count="41804" /> </mem-info> </gc-end> <cycle-end id="255" type="global" contextid="247" timestamp="2013-12-05T10:20:14.105" /> <sys-end id="256" timestamp="2013-12-05T10:20:14.106" /> <exclusive-end id="257" timestamp="2013-12-05T10:20:14.106" durationms="100.239" />
本文将描述IBM JDK下常用参数的设置。
-Xms:最小堆大小
-Xmx:最大堆大小
-Xminf and -Xmaxf:GC(垃圾回收)之后可用空间的最小值最大值
-Xmine and -Xmaxe:堆增长的最小最大值
-Xmint and -Xmaxt:垃圾回收占时间整个运行时间的比例,默认是5%。如果回收时间小于5%,那么它就缩减堆,反之增大。
一般来说只要对Xms和Xmx设置合理,后面的三对不用特别设置。可以看看http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp上heap expasion和heap shrinkage两章的说明,除非有下文的情况:
如果使用大小可变的堆(比如,-Xms 和 -Xmx 不同),应用程序可能遇到这样的情况,不断出现分配失败而堆没有扩展。这就是堆失效,是由于堆的大小刚刚能够避免扩展但又不足以解决以后的分配失败而造成的。通常,垃圾收集周期释放的空间不仅可以满足当前的分配失败,而且还有很多可供以后的分配请求使用的空间。但是,如果堆处于失效状态,那么每个垃圾收集周期释放的空间刚刚能够满足当前的分配失败。结果,下一次分配请求时,又会进入垃圾收集周期,依此类推。大量生存时间很短的对象也可能造成这种现象。避免这种循环的一种办法是增加 -Xminf 和 -Xmaxf 的值。比方说,如果使用 -Xminf.5,堆将增长到至少有 50% 的自由空间。同样,增加 -Xmaxf 也是很合理。如果 -Xminf等于0.5,-Xmaxf 为默认值 0.6,因为 JVM 要把自由空间比例保持在 50% 和 60% 之间,所以就会出现太多的扩展和收缩。两者相差 0.3 是一个不错的选择,这样 -Xmaxf.8 可以很好地匹配 -Xminf.5。如果记录表明,需要多次扩展才能达到稳定的堆大小,但可以更改 -Xmine,根据应用程序的行为来设置扩展大小的最小值。目标是获得足够的可用空间,不仅能满足当前的请求,而且能满足以后的很多请求,从而避免过多的垃圾收集周期。-Xmine、-Xmaxf 和 -Xminf 为控制应用程序的内存使用特性提供了很大的灵活性。
摘自Java性能优化的策略和常见方法
所以在应用正式上线的头一段时间,最好把GC日志打开,观察一下堆(heap)的增长(expasion)和收缩(shrinkage)。最佳的情况就是,每次回收后可用的堆大小占整个堆的50%左右。如果回收后才腾出30%不到的可用空间,那就该再调整一下上述的参数了。下图看起来直观一点,使用-verbose:size参数可以查看当前的默认值。
那为何不把Xms和Xmx设置成一样大,就像SUN的JDK所推荐的那样?
Using the same values is not usually a good idea, because it delays the start of garbage collection until the heap is full. The first time that the Garbage Collector runs, therefore, becomes a very expensive operation. Also, the heap is more likely to be fragmented and require a heap compaction. Again this is a very expensive operation.……
If the Garbage Collector cannot find enough garbage, it runs compaction. If the Garbage Collector finds enough garbage, or any of the other conditions for heap expansion are met , the Garbage Collector expands the heap.
因为IBM JDK采用的是标记(mark)-扫描(sweep)-标记-……-扫描-紧凑排列(compact),如果还不能提供足够的空间,扩展堆(expasion)。依次循环,直到达到最大堆大小。每次扩展前,那些长存的对象就被调整到堆的底部,每次扩展后需要再动的量就很少。所以如果把Xms设置成和Xmx一样,那么扫描和紧凑排列这么一个充满内存碎片的大堆的开销将大大高于从小扩展堆的开销。
The overheads of expanding the heap are almost trivial compared to the cost of collecting and compacting a very large fragmented heap.
这是由于IBM的GC特点造成的,而SUN的JDK采用的是分代回收的策略,所以就没有这种情况,反而会受益于堆大小一致。不过这么说起来,用了-Xgcpolicy:gencon,就应该把最小堆最大堆设置成一样咯。
在Gencon回收策略下,可以通过-Xmn来设置婴儿区域(Nursery或者叫young)的大小,通过-Xmo来设置长存区(tenured或者old)的大小。注意-Xmn不能和-Xmns/-Xmnx参数一起使用,-Xmo不能和-Xmos/-Xmox一起使用,否则会报错。前者就是把年轻代和长存代的大小固定了,而后两者就是设定两个部分最大最小的范围,默认情况下:
-Xmns是-Xms的25%或者64M(在JDK 5.0中默认是25%)
-Xmnx是-Xmx的25%或者64M(同上)
-Xmos是-Xmx减去-Xmns的大小
-Xmox是和-Xmx一样大
可见默认的年轻代太小了,生产环境中有必要改大一点。因为年轻代使用的是复制策略,所以回收速度相当快(minor gc),而长存代使用的是和optavgpause 策略相似的方式进行并发标志、扫描策略,回收速度比较慢(major gc)。理想情况是minor gc和major gc的比值在1:1010:1左右。(可以通过GC日志查看回收的区域)
gencon中年老期限(Tenure age)和倾斜比率(Tilt ratio)这两个参数是JVM自己动态调整的。
针对固定对象问题(Pinned Objects),使用-Xk -Xp参数设定kCluster和pCluster,Avoiding Java heap fragmentation with Java SDK V1.4.2. 或者我这篇IBM JDK的Java堆空间的碎片问题。
一些不常用的参数:
-Xloainitial<percentage> -Xloamaximum<percentage> :调整大对象区域(Large Object Area)的大小。分配总是先在SOA(Small Object Area)中分配,如果没有空间并且需要分配的大小大于64K,那么分配到LOA。默认情况下为-Xloainitial0.05 (5%),-Xloamaximum0.5 (50%),如果你的程序确实需要分配许多大对象的话(大于64K),那么可以调整LOA的初始百分比。
以上两点可以参考我这篇IBM JDK的Java堆空间的碎片问题,获得更详细的解释。
总结一下来说,对于optthruput和optavgpause,设置恰当的最大堆和最小堆,设置-Xk和-Xp避免碎片问题,如果程序需要分配大对象较多,那么调整一下LOA的大小;对于gencon,可以调大最小堆和最大堆接近,调整young区域的大小,LOA也可以视情况调整。subpool一般用不到,就不去研究了。
一些另外的信息
Default settings for the JVM
JVM environment settings
默认的Heapdumps是关闭的,调试的时候记得打开;默认的Javadumps on out of memory和Heapdumps on out of memory都是开启的,但是默认的dump位置是profile的所在目录,最好在管理控制台java进程中把IBM_HEAPDUMPDIR和IBM_JAVACOREDIR设置到别的目录,防止dump内容把WAS的文件系统撑爆,影响正常业务使用。
在Windows机器上,如果内存大于4G,记得开启/3GB参数,这样可以使JVM Heap可以设置的更大一些,接近2G-1,(其它的三部分可以扩展到另外的1G上去),但一般最大不超过1.7G。
相关推荐
总之,理解和掌握JVM参数优化、运行时数据区的结构以及垃圾回收机制,是每个Java开发者提高应用性能、避免内存泄漏和优化系统资源利用率的关键。通过细心的调整和不断的实践,可以打造出更加高效稳定的Java应用程序...
4. **JVM参数设置** - `-XX:MaxPermSize`:在JDK 1.7及更早版本中,用于设置永久代的最大大小,防止类信息溢出。 - `J9` 和 `JRockit`:IBM的JVM实现,支持不同的垃圾收集器和内存管理策略,如J9有自己的 perm gen...
IBM JDK与Oracle JDK相比,虽然它们都实现了Java标准,但IBM JDK通常在性能、内存管理和安全性方面有其独特的优化。IBM JDK 1.7的64位版本尤其适用于需要处理大量数据或需要高效内存管理的应用场景。 在安装和配置...
总结来说,IBM JDK 1.5.0是IBM针对Java SE 5.0标准的一个实现,它在保持与标准兼容的同时,提供了许多性能优化和特色功能,尤其适合在Windows 32位系统上的企业级Java应用开发。对于开发者而言,掌握IBM JDK的使用能...
6. **conf目录**(可能包含):存储配置文件,如java.security用于设置安全策略,以及jvm.options用于配置JVM参数。 配置IBM JDK 1.6到IDE(如Eclipse、IntelliJ IDEA)的过程大致如下: 1. **设置环境变量**:在...
通过细致的监控和分析,结合适当的JVM参数设置,可以有效地提升WebSphere的运行效率,减少因内存管理问题引发的性能瓶颈。同时,了解不同操作系统和JDK版本对JVM行为的影响也是优化过程中不可忽视的一环。
4. 性能调优:根据应用需求,可能需要调整JVM参数以优化性能,如堆大小、垃圾收集器设置等。 总之,"zulu8.50.0.51-ca-jdk8.0.275-win-x64" 是Azul Systems提供的一个针对Windows 64位系统的Java 8开发工具包,具有...
###### 2.1.1 Java虚拟机性能优化 - **选择合适的JDK版本**:根据客户所使用的操作系统类型选择相应的JDK版本,并推荐使用最新的版本以获得更好的兼容性和性能。 - **调整虚拟机内存配置**: - `-Xms<size>`:...
在安装IBM JDK6 SR15时,用户应遵循官方文档的指导,注意系统需求,例如硬件配置、操作系统版本等,并根据实际环境设置合适的JVM参数。同时,进行充分的测试以确保应用程序在新的JDK环境下能够正常运行。
不同公司根据JVM规范实现了自己的JRE(Java运行环境),如Oracle的Hotspot JDK、IBM的JDK、阿里巴巴的淘宝JDK等。Oracle通过收购Sun和BEA,将Jrockit和Hotspot JDK整合到了一起,提供了-client和-server两种启动选项...
### JVM性能优化详解 #### JVM基础知识 在深入了解JVM性能优化之前,我们首先需要了解JVM的基本概念。JVM(Java Virtual Machine)是运行Java字节码的虚拟机环境,它为Java应用程序提供了运行时环境。JVM的核心...
Weblogic作为一款广泛应用于企业级应用开发和部署的中间件平台,其性能优化对于提高应用程序响应速度、增强用户体验具有重要意义。Weblogic优化主要包括内存设置和参数调整两大部分。 #### 二、Weblogic内存设置 ...
Java虚拟机(JVM)是Java程序的核心组成部分,它为Java...总的来说,理解JVM的工作原理、内存管理、性能优化以及其在跨平台和跨语言方面的角色,对于Java开发者来说至关重要,这有助于编写出更高效、稳定的应用程序。
OpenJDK12U-jdk_x64_windows_openj9_12.0.1_12_openj9-0.14.1.zip是一个针对Windows 64位操作系统的OpenJDK12版本,由...为了确保最佳性能,可以根据具体需求调整JVM参数,例如使用Shenandoah GC或者优化内存配置。
- **JDK**(Java Development Kit):包含了JVM,同时还包含了一组开发工具(如编译器javac、调试器jdb等),用于编写和调试Java应用程序。 - **JVM**:仅仅是JDK的一部分,负责执行Java字节码。JDK还包括了其他工具...
在Java Web开发中,性能优化是一项至关重要的任务,特别是对于JVM(Java虚拟机)的管理,包括线程和内存的高效使用。当系统出现性能瓶颈或者内存泄漏时,了解如何排查和解决这些问题显得尤为关键。本文将详细介绍...
为了确保应用程序的稳定性和性能,了解IBM JDK 1.7在AIX上的性能优化策略也是必要的。这包括了解如何调整JVM参数,如-Xms和-Xmx以控制内存分配,以及如何利用IBM JDK特有的性能监控工具来分析和优化应用程序。 总的...
### Tomcat性能优化 在基于Java的企业级应用开发中,Apache Tomcat因其开源特性以及良好的兼容性和稳定性成为了广泛采用的Web容器之一。然而,在实际应用过程中,开发人员常常会遇到诸如系统响应速度变慢或Tomcat...
- IBM JVM提供了强大的内存管理和性能优化功能。 - 支持多种垃圾回收策略,如CMS (Concurrent Mark Sweep) 和 G1 (Garbage First)。 **1.5 Java编译** - **解释模式**: JVM首先对字节码进行解释执行。 - **实时...