基于JVM的异常诊断和性能调优

JVM GC原理介绍:

   以前我作为java开发人员,用的都是sunJVM(这也是当今最好用的虚拟机),由于垃圾收集的工作都是交给JVM做,只要编码的时候注意不要在静态的集合对象中只添加对象,而不删除对象的情况发生,就可以避免内存泄漏,所以自己从没有认真考虑过要将GC好好学习一下;然而实际的工作表明,不深入的学习GC的原理,很难解决生产中的问题。

   学习开始从理解JVMGC工作原理入手。垃圾收集的过程主要分三个步骤:标记(mark),清除(sweep),整理(compact)。标记过程就是看看在JVM堆中有哪些对象还有用,哪些对象不用了,有用的对象就作个标记,不用的对象就不作标记;对未作标记的对象(即不用的对象)就作第二步清除;当清除完以后,由于有用的对象此时是分散的分布在JVM堆中,JVM堆就会有许多堆碎片,因而需要做第三步整理;整理(也有人翻译成“压缩”,实际上最准确的翻译是“使紧凑”)就是将散放在JVM堆中的有用对象移动到堆底部,削除堆碎片。

然而,原理虽然简单,可各个厂商在对GC的具体实现上却有区别,从而导致相同的应用,在不同的JVM上会出现不同问题。现在我们主要看看IBM JVM GCSUN JVM GC的实现方式和行为。

javaC/C++在内存泄露上定义不同,java上内存泄露是说持有了不该再持有的对象

 

一.SUNJVM介绍


SUNJVM采用分代垃圾收集generational garbage collection)的方式,从JDK1.4.1开始,它将JVM堆栈分成三个部分:年轻代(young generation)、年老代(old/tenured generation)和持久代(permanent generation)。关于分代垃圾收集的详细介绍请查阅参考文献([25]、[26])。

分代收集示意图

 

<!-- [if gte vml 1]> <![endif]-->

持久代用于存储装载的类、方法对象(Class对象和Method对象)和其它相关的元数据,默认大小为4MB。以下是几个常用的设置持久代的JVM参数:

-XX:PermSize=4m      设定持久代的大小

-XX:MaxPermSize=64m  设定持久代大小的最大值

-Xnoclassgc          禁止对持久代进行收集

对于年轻代和年老代的设定,是基于这样的统计分析结果:在绝大多数的应用程序中,一些对象在创建后很快成为了垃圾,这部分对象占到了新创建对象的90%以上;而另一些对象,数目相对较少,但要长期驻留在内存中;于是对于这两种存活时间不同的对象,SUNJVM将堆分出了两个不同的区域,采用不同算法进行收集。SUNJVM通过不同的收集器实现不同的收集算法。下面就详细介绍几种收集器,以及在这两个代中所采用的收集器。

复制收集器Copying Collector):堆被分成两个大小相等的空间,其中一个为活跃的空间用于分配对象,另一个为不活跃的空间未使用;当用于分配的空间占满后,程序就会停止,活跃的对象被从活跃的空间复制到不活跃的空间中;复制完成后,空间的角色就会转换,原来不活跃的空间成为了新的活跃空间。由于活跃的对象直接被复制到不活跃的空间,所以此过程并不存在标记这个步骤。

标记-清除收集器Mark and Sweep Collector):在标记过程中,死对象所占用的地址空间将被记录在专门的表中;标记过程结束后,相邻的死对象所占的空间将合并在一起,由于此收集器不整理堆,将会产生越来越多的堆碎片。

标记-整理收集器Mark and Compact Collector):在标记过程中,给活的对象或死的对象做标记;标记过程结束后,将堆中活对象复制到堆的底部,使这些活的对象紧凑的排列在一起,避免堆碎片产生;在执行此收集过程中将停止所有应用程序线程的执行。

 

 

 

在年轻代主要采用复制收集器进行收集。实际上SUNJVM对此收集器做了一些改进,它将年轻代分为一个创建空间(eden space)和两个残存空间(survivor space。小的收集将活的对象从创建空间和一个残存空间复制到另一个残存空间;然后将创建空间和另一个残存空间看成是一个整体,分配对象;当空间被占满,就将活的对象从创建空间和另一个残存空间复制到第一个残存空间;如此反复。若残存空间过小,部分活的对象将溢出到年老代,从而增加了年老代的的收集频率,由于在年老代进行的收集所花的时间远多于在年轻代进行的收集,运行系统性能就会恶化,所以合理设置残存空间的大小,可以对JVM进行调优。以下是几个常用的设置年轻代的JVM参数:

-XX:SurvivorRatio=8       设定创建空间和残存空间之间的大小比率

-XX:MaxTenuringThreshold=0 设定残存空间期限阈值(Tenuring Threshold

-XX:NewSize=size           设定年轻代的大小(字节)
-XX:MaxNewSize=size        
设定年轻代的最大大小(字节)

-XX:NewRatio=2             设定年轻代和年老代之间的大小比率

 

 

 

在年老代主要采用标记-清除收集器标记-整理收集器进行收集。

SUNJVM中还有其它几种收集器,包括增量收集Incremental Collector)、并行复制收集器ParallelCopying Collector)、并行清除收集器Parallel Scavenge Collector)和并发标记-清除收集器Concurrent Mark-Sweep(CMS) Collector)等。并行复制收集器和并发标记-清除收集器基本上是默认的复制收集器和标记-清除收集器的并发版本。这些一般在多CPU和大内存的条件下设置,关于并行复制收集器和并发标记-清除收集器的详细介绍请查阅参考文献([20]),关于这些收集器的详细介绍请查阅参考文献([27][28][29][31])。

-XX:+UseParNewGC         启用年轻代并行复制收集器,它将垃圾收集的工作分为与CPU数量一样多的线程。可以和-XX:+UseConcMarkSweepGC一起使用。

-XX:+UseParallelGC       启用年轻代并行清除收集器,针对多处理器系统上非常大(G字节以及更大的)堆进行了优化。不可以和-XX:+UseConcMarkSweepGC一起使用。

-XX:+UseConcMarkSweepGC  启用年老代并发标记-清除收集器,它在初始标记阶段(及在以后暂短重新标记阶段)暂短地停止整个系统,然后恢复用户程序,同时垃圾收集器线程与用户程序并发地执行

 

 

 

SUNJVMGC时分小收集(minor collection)和大收集(major collection)。小收集只在年轻代中作GC。大收集先在年轻代作GC,再在年老代作GC,因此大收集将花去更多的时间。可以通过-Xloggc:filename-verbose:gc开启GC日志,关于更详细的GC日志设置请查阅参考文献([29])。

以上是对SUNJVM的实现和性能调优的简单介绍,关于这些收集器的详细介绍请查阅参考文献(SUN JVM资料

 

   由于对象的引用方式的不同,JVM的收集策略也不同。Java对象的引用方式分为:强引用(strong reference)、软引用(soft reference)、弱引用(weak reference)和虚引用(phantom reference)。因此根据访问方式,对象也就分为如下4种:

   强可及对象(strongly reachable):可以通过强引用访问的对象。它将一直占有堆空间,在JVM报告内存不足的情况下也不会释放。

   软可及对象(softly reachable):不是强可及对象,并且能够通过软引用访问的对象。在JVM报告内存不足时,才考虑将它释放;只要内存不太紧张,就会保留该对象。关于软引用的具体运用请查阅参考文献([13]

   弱可及对象(weakly reachable):不是强可及对象也不是软可及对象,并且能够通过弱引用访问的对象。JVM随时都会将它释放。关于弱引用的具体运用请查阅参考文献([12]

   虚可及对象(phantomly reachable):不是强可及对象、软可及对象,也不是弱可及对象,已经结束的,可以通过虚引用访问的对象。JVM已经执行完finalize()方法,随时都会将它释放。

   对于软引用、弱引用和虚引用的实现,java中定义了3个引用类:SoftReferenceWeakReferencePhantomReference

SoftReference对象或WeakReference对象都是先将referent域被设置为null;然后它们引用过的heap对象被声明为 finalizable;最后,当heap对象的finalize()方法被运行而且该对象占用的内存被释放,SoftReference对象或WeakReference对象就被添加到它的引用队列(ReferenceQueue

PhantomReference对象与SoftReference对象或WeakReference对象的最大区别在于,SoftReference对象或WeakReference对象是在它们所引用的对象被垃圾收集器收集之后被添加到ReferenceQueue,而PhantomReference对象是在它所引用的对象被垃圾收集器收集之前添加到ReferenceQueue。因此,虚可及对象存在最后一次被找回的机会。关于引用类的详细使用请查阅参考文献([10][11]

 

二.IBMJVM介绍


IBMJVM1.5.0以前,默认采用经典的三步式垃圾收集策略,即标记-清除-整理(mark-sweep-compact)。它没有像SUNJVM那样将堆分成三个代,而是只有一个区域。在堆空间底部会分配一个K簇(k-cluster),它是专门用来存储类块class block)的区域。当K簇满了的情况下,在P簇(p-cluster)中继续分配类块。有些对象永远或者临时无法移动,这些固定不动的对象就是常说的pinned对象。P簇就是用来存贮这些pin对象的。新的P簇可以被分配到任何地方而且又不能被移动,这就容易造成碎片问题。为了解决这些问题,IBMJDK 1.4.2版本中起用了pinnedFreeList来改变P簇的分配方法。同时提供了命令行参数对K簇和P簇的大小进行配置。关于K簇和P簇更详细的介绍请查阅参考文献([55])。

IBM JDK 1.5.0开始,它的垃圾收集策略有4种,关于垃圾收集策略的详细介绍请查阅参考文献([54]):

-Xgcpolicy:optthruput 是默认策略,采用标记-清除-整理收集器,针对吞吐量进行优化。然而,由于标记栈大小固定并且无法设置,当堆中有大量对象生成时,显然标记栈会不够用,标记栈溢出(mark stack overflow)将会产生。

-Xgcpolicy:optavgpause 会启用同步标记,针对停顿时间进行优化,这将减少暂停时间并且让暂停时间长度在堆空间占用率上升的时候更稳定。然而,这个参数将减少系统吞吐量大约5%,当然这一数值将因程序不同而有一定差异。

-Xgcpolicy:gencon     分代并发,从IBM JDK 1.5.0开始加入。类似于SUNJVM的分代收集,但年老代是采用并发标记并且年轻代两个半空间大小相等。

-Xgcpolicy:subpool    子池,这种策略只能在AIX平台上使用。

     除以上4种垃圾收集策略外,还有其它参数会改变GC的行为:

    -Xcompactgc          强制进行整理

    -Xnocompactgc        不进行整理

-Xgcthreads          设置GC辅助线程的个数,打开-Xgcpolicy:optavgpause时才有用

想要打印GC日志,使用-verbosegc-verbose:gc,关于IBM JVM原理的更详细介绍请查阅参考文献([50][53])。

 

三.SUNJVM  vs  IBMJVM


下面,我们就将SUNJVMIBMJVM做个对比:

a. IBMJVM采用标记-清除-整理收集器,这种方式的最大弊端就是在需要生成大量对象的应用中,标记栈会不够用,再由于IBMJVM标记栈大小固定并且无法设置,标记栈溢出将会产生;而SUNJVM就不会有这样的问题。SUNJVM由于采用分代收集策略,在年轻代采用复制收集器,它不必为生成的大量对象作标记,只是将活着的对象复制到另一个区域;而在年老代采用标记-整理收集器,虽使用标记栈,但由于这些对象是长期存在于JVM中的,且数量相对较少,所以不会出现标记栈溢出的问题。标记栈溢出一旦发生,系统性能将骤然下降,且无法恢复,关于标记栈溢出的详细介绍请查阅参考文献([53],Part 2 Garbage collection[51])。IBM自己也认识到这个收集器存在的问题,从JDK 1.5.0开始,引入了分代收集策略,算是解决了这个问题,但SUNJVM早在JDK1.3就采了分代收集策略,不知为何IBM采用此方式如此之晚?

b.JDK 1.5.0以前,IBMJVM由于没有分代,类的类对象和其它一些元数据不像SUNJVM一样放在持久代中,而是首先放在堆底部的K簇中,当K簇容纳不下时,就会在堆中的可用空间中分配固定大小的P簇来存放,这些P簇散放在堆中,即无法收集也无法移动,所以IBMJVM非常容易产生堆碎片。IBMJDK 1.4.2版本中起用了pinnedFreeList来改变P簇的分配方法,在分配新的P簇之前会作GC,然后尽量在堆的底部分配P簇。这种方法基本上解决了堆碎片问题。除了P簇中存放的pinned对象外,永远或者临时无法移动的对象还包括dosed对象。pinned对象是被native引用的对象,包括Thread对象、类的Class对象;dosed对象是被线程栈引用的对象。dosed对象除非线程栈主动释放,否则也无法移动。关于dosed对象的一些信息请查阅参考文献([53],Part 1 Object allocation;Part 2 Garbagecollection)。


<!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><!-- [if !mso]>


<!-- [if gte mso 10]>

JVM异常诊断与性能调优:

Java程序的性能问题主要由几方面原因造成:

1. 某些对象在运行一段时间后,占用大量内存资源不释放,甚至占用内存资源越来越多,导致内存泄漏。

2. 某些线程上的某些方法由于长时间运行,占用大量CPU时间,导致系统性能下降。

3. 有死锁或资源争用的情况存在,造成某些线程长期等待。

 

对于以上性能问题的监控、诊断和分析,各个JVM厂商以及应用服务器厂商都提供了不同的方法或工具,下面就做简要介绍:

 

一.SUN提供的方法和工具

SunJVM提供了多种方式对性能进行监控和分析:

1. 使用jvmstat命令

JDK1.4.1开始,SunJVM支持使用命令jvmpsjvmstatperfagent;从JDK1.5.0开始,这些命令相应变为jpsjstatjstatd

jps      列出系统中正在运行的JVM实例

jstat     列出指定JVM实例中的各个分代的使用情况,GC运行情况等,并且此过程是实时的

jstatd   本地jstat守护进程,可让远程jstat访问本地JVM

关于jpsjstatjstatd的更详细的介绍请查阅([32][33])。

 

2. 生成GC日志

添加JVM参数 -verbose:gc或者 -Xloggc:filename,生成GC日志。

通过分析GC日志可以粗略的了解JVM堆的使用情况。例如,可以知道什么时候GC比较频繁,说明此时java程序正在大量分配对象;若JVM堆的占用不断在增长,说明java程序可能存在内存泄漏的情况;若GC的执行时间非常长,可能堆的最大值设得比较小。参考资料中有一个例子说明如何分析和调优GC性能([21])。有一些图形化的工具可以帮助分析GC日志,例如JTune等。

为了得到更详细的GC信息,可以使用如下JVM参数:

-XX:-PrintGCDetails

-XX:-PrintGCTimeStamps

-XX:-PrintTenuringDistribution  打印出对象在放入年老代之前在年轻代做了多少次复制

关于GC日志的更详细的介绍请查阅([29][53][54])。

 

3. 生成hprof文件。

通过设置不同的JVM参数可以得到含有不同信息的hprof文件,下面是一些比较常用的参数设置:

-agentlib:hprof=file=file,format=b 创建堆转储,将堆转储导入指定文件

-agentlib:hprof=heap=dump  创建堆转储,获取堆快照

-agentlib:hprof=heap=sites  跟踪堆的分配

-agentlib:hprof=cpu=samples线程的CPU占用时间

-agentlib:hprof=cpu=times   方法的CPU占用时间

JDK1.5.0以前使用-Xrunhprof;从JDK1.5.0开始改用-agentlib:hprof-Xrunhprof仍然可以使用。可以使用PerfAnalHAThprof文件进行分析。

关于hprof的更详细的介绍请查阅([34][35][36][37])。

 

4. 监控工具JConsole

JDK1.5.0开始,Sun提供了JVM实时监控工具JConsole。它是JMX兼容的图形化监控工具,它可以监控本地或远程的JVM实例。添加JVM参数-Dcom.sun.management.jmxremote使应用程序启动管理代理,这样启动JConsole后就可以找到这个应用并实时监控。JConsole可以监控内存、线程、操作系统等,它可对线程进行分析并诊断出死锁。

关于JConsole的更详细的介绍请查阅([38][39])。

 

二.IBM提供的方法和工具

1. 生成的GC日志

添加JVM参数-verbose:gc,生成的GC日志可以用以下工具分析:

IBM Pattern Modeling andAnalysis Tool for Java Garbage Collector  http://www.alphaworks.ibm.com/tech/pmat

Diagnostic Tool for JavaGarbage Collector http://www.alphaworks.ibm.com/tech/gcdiag

关于如何打印和分析GC日志,可参考([55],Part 3 verbosegc and command-line parameters[59]

下面对最一般的GC格式作简单介绍:

  <GC(4): GC cycle started Fri Apr 0414:27:20 2008

  <GC(4): freed 34873824 bytes, 84% free(451978888/536869376), in 78 ms>

  <GC(4): mark: 69 ms, sweep: 9 ms, compact:0 ms>

  <GC(4): refs: soft 0 (age >= 32), weak0, final 329, phantom 0>

第一行:此次GC发生的时间;

第二行:已释放34873824字节,释放完以后JVM堆有84%的空余,其中堆的总大小为536869376字节,空闲451978888字节,GC用去的总时间为78ms

第三行:GC的三个阶段分别用去的是时间,其中标记(mark)阶段用了69ms,清除(sweep)阶段用了9ms,整理(compact)阶段用了0ms

第四行:在此次GC中分别收集了多少个特殊的引用对象,其中收集的软(soft)引用对象0个,弱(weak)引用对象0个,虚(phantom)引用对象0个,以及由finalizer线程引用的对象329个。

 

2. 使用方法跟踪

使用方法跟踪,可跟踪方法的进入、退出、输入参数和返回值

-Dibm.dg.trc.print=mt 启动方法跟踪

-Dibm.dg.trc.methods 设置要跟踪的方法,例如:

-Dibm.dg.trc.methods=java/lang/String.* 跟踪String所有方法的进入和退出

-Dibm.dg.trc.methods=java/lang/String.*() 跟踪String所有方法的进入和退出,以及输入参数的值

-Dibm.dg.trc.methods=ArticleUI.*,!ArticleUI.get*   跟踪ArticleUI的所有方法,但不跟踪以get开头的方法

关于方法跟踪的更多信息,请查阅([56] Chapter 28. Using method trace,[56] Chapter 33. TracingJava applications and the JVM

 

3. 堆转储(heap dump

JVM收到信号、堆空间不足或在程序中调用com.ibm.jvm.Dump.HeapDump()后都会生成heap dump。设置如下环境变量:

IBM_HEAPDUMP/IBM_HEAP_DUMP    true                        # Enables heap dumps by means ofsignals.(Ctrl-/ on AIX or Linux,Ctrl-BREAK on Windows)

IBM_HEAPDUMPDIR               <your_dump_dir>             #heapdump存放目录

IBM_HEAPDUMP_OUTOFMEMORY      true                        #OutOfMemory时生成heapdump

关于堆转储的更多信息,请查阅([56]Chapter 26. Using Heapdump)。

IBM JDK1.5.0开始,可以使用dump agent来生成heap dump,例如:

-Xdump:heap:events=vmstop,opts=PHD+CLASSIC               #表示在JVM停止时生成phd格式和txt格式的heapdump

-Xdump:heap:events=user,opts=PHD                         #表示JVM收到信号时生成heap dump

-Xdump:heap:events=throw,filter=java/lang/OutOfMem*      #表示在OutOfMemory时生成heapdump

-Xdump:heap:none                                         #表示关闭所有生成heap dump的操作

关于dump agent的更多信息,请查阅([64] Chapter23. Using dump agents,[64] Chapter 25. Using Heapdump)。

 

4. 线程转储(java dump

严重的native错误,JVM收到信号,堆空间不足或在程序中调用com.ibm.jvm.Dump.JavaDump()后都会生成java dump。有用的环境变量设置:

DISABLE_JAVADUMP                                          #禁用javadump,可设成任意值

IBM_JAVACOREDIR               <your_dump_dir>             #javadump存放目录

IBM_JAVADUMP_OUTOFMEMORY      false                       #OutOfMemory时不生成javadump

关于堆转储的更多信息,请查阅([56]Chapter 25. Using Javadump)。

IBM JDK1.5.0开始,可以使用dump agent来生成java dump,例如:

-Xdump:java:events=user                                   #表示JVM收到信号时生成java dump

-Xdump:java:events=throw,filter=java/lang/OutOfMem*       #表示在OutOfMemory时生成javadump

-Xdump:java:none                                          #表示关闭所有生成javadump的操作

关于dump agent的更多信息,请查阅([64]Chapter 23. Using dump agents,[64] Chapter 24. Using Javadump)。

 

5. WebSphere提供的方法和工具

使用WebSphere提供的wsadmin工具获得堆转储(heap dump)和线程转储(java dump

wsadmin工具的路径:${WAS_HOME}/AppServer/bin/wsadmin.bat

WebSphere6.1中使用IBM JDK 1.5,可以使用如下命令生成java dumpheap dump

生成heap dump的方法如下:

 #查找 JVM objectName

  <wsadmin> set objectName [$AdminControlqueryNames WebSphere:type=JVM,process=<servername>,node=<nodename>,*] 

 # JVM MBean 调用generateHeapDump操作:

  <wsadmin> $AdminControl invoke$objectName generateHeapDump

 

  生成java dump的方法如下:

 #查找 JVM objectName

  <wsadmin>set objectName[$AdminControl queryNames WebSphere:type=JVM,process=<servername>,node=<nodename>,*] 

 # JVM MBean调用dumpThreads操作:

  <wsadmin> $AdminControl invoke$objectName dumpThreads

 

 WebSphere5.1WebSphere6.0中,使用IBM JDK 1.4.2中,由于generateHeapDump不可用,可以使用如下命令生成java dumpheap dump

  可以在"进程管理 ->进程定义 -> 环境条目"中添加以下属性:

 IBM_HEAPDUMP                  true                        #Enables heap dumps by means of signals

    IBM_HEAP_DUMP                 true                        # Enables heap dumps by means ofsignals

    IBM_HEAPDUMPDIR               <your_dump_dir>             #heapdump存放目录

    IBM_HEAPDUMP_OUTOFMEMORY      true                        #OutOfMemory时生成heapdump

    IBM_JAVADUMP_OUTOFMEMORY      true                        #OutOfMemory时生成javadump

    IBM_JAVA_HEAPDUMP_TEXT        true                        # Enables heap dumps to be generatedin .txt format not in .phd format

 

  生成heap dump的方法如下:

 #查找 JVM objectName

  <wsadmin> set objectName [$AdminControlqueryNamesWebSphere:type=JVM,process=<servername>,node=<nodename>,*] 

 # JVM MBean 调用dumpThreads操作:

  <wsadmin> $AdminControl invoke$objectName dumpThreads

 

  生成java dump的方法如下:

 #查找 JVM objectName

  <wsadmin> set objectName [$AdminControlqueryNamesWebSphere:type=JVM,process=<servername>,node=<nodename>,*] 

 按下Ctrl+Break

 

关于如何生成java dumpheap dump,请参考([60][63)。

分析java dump的工具:IBM Thread and Monitor DumpAnalyzer for Java   http://www.alphaworks.ibm.com/tech/jca

分析heap dump的工具:HeapAnalyzer   http://www.alphaworks.ibm.com/tech/heapanalyzer


关于WebSphere的更多诊断工具的介绍,请参考([61])。


<!-- [if gte mso 9]><![endif]--><!-- [if gte mso 9]><![endif]--><!-- [if !mso]><!-- [if gte mso 10]>

参考文献:

WebSphere系统管理

[1]WebSphere Application Server V5系统管理:

1部分:V5 管理概览 http://www.ibm.com/developerworks/cn/websphere/techjournal/0301_williamson/williamson.html

2部分:编写您自己的管理程序  http://www.ibm.com/developerworks/cn/websphere/techjournal/0302_cundiff/cundiff.html

3部分:事件通知  http://www.ibm.com/developerworks/cn/websphere/techjournal/0304_lauzon/lauzon.html

4部分:如何扩展 WebSphere 管理系统  http://www.ibm.com/developerworks/cn/websphere/techjournal/0304_williamson/williamson.html

5部分:程序化配置  http://www.ibm.com/developerworks/cn/websphere/techjournal/0307_wang/wang.html

6部分:应用程序管理  http://www.ibm.com/developerworks/cn/websphere/techjournal/0309_apte/apte.html

[2]WebSphere管理资料  http://blog.chinaunix.net/u/473/showart_105062.html

[3]IBM WebSphere开发者技术期刊: WebSphere Application Server V5高级安全性和系统加固

http://www.ibm.com/developerworks/cn/websphere/techjournal/0406_botzum/0406_botzum.html

[4]IBM InfoCenter http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1/index.jsp

[5] IBM WebSphere V5.0 Security WebSphere Handbook Series http://publib-b.boulder.ibm.com/abstracts/sg246573.html?Open

[6] WAS 5.x中数据源的配置使用及其常见问题 http://www.ibm.com/developerworks/cn/websphere/library/techarticles/fanggw/0406_was5ds/was5ds.html

[7] Understanding the WebSphere Application Server Web serverplug-in http://www.ibm.com/developerworks/websphere/library/techarticles/0310_cocasse/cocasse.html

[8] WebSphere应用服务器环境搭建实践指南  http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0707_wudan/

[9] WebSphere Application Server V6.1: System Management andConfiguration http://www.redbooks.ibm.com/abstracts/sg247304.html?Open

 

GC资料

[10]Reference Objects and Garbage Collection http://www.pawlan.com/Monica/refobjs/

[11]Java 2引用类使用指南 http://www.ibm.com/developerworks/cn/java/j-refs/

[12]Java理论与实践:用弱引用堵住内存泄漏  http://www.ibm.com/developerworks/cn/java/j-jtp11225/

[13]Java理论和实践:用软引用阻止内存泄漏  http://www.ibm.com/developerworks/cn/java/j-jtp01246.html

[14]垃圾收集器与Java编程  http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak2/

 

SUN JVM资料

[20]关注性能:谈论垃圾  http://www.ibm.com/developerworks/cn/java/j-perf05214/

[21]关注性能:调优垃圾收集  http://www.ibm.com/developerworks/cn/java/j-perf06304/

[22]Java理论与实践:垃圾收集简史http://www.ibm.com/developerworks/cn/java/j-jtp10283/

[23]Java理论与实践:JVM 1.4.1中的垃圾收集  http://www.ibm.com/developerworks/cn/java/j-jtp11253/index.html

[24]Javatheory and practice: Garbage collection and performance

http://www.ibm.com/developerworks/java/library/j-jtp01274.html?S_TACT=105AGX52&S_CMP=cn-a-j

[25]TuningGarbage Collection with the 1_4_2 Java[tm] Virtual Machine  http://java.sun.com/docs/hotspot/gc1.4.2/index.html

[26]TuningGarbage Collection with the 5.0 JavaTM Virtual Machine http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

[27]ImprovingJava Application Performance and Scalability by Reducing Garbage CollectionTimes and Sizing Memory

http://developers.sun.com/mobility/midp/articles/garbage/

[28]ImprovingJava Application Performance and Scalability by Reducing Garbage CollectionTimes and Sizing Memory Using JDK 1.4.1

http://developers.sun.com/mobility/midp/articles/garbagecollection2/

[29]JavaHotSpot VM Options http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

[30]FrequentlyAsked Questions about Garbage Collection in the Hotspot[TM] Java[TM] VirtualMachine

 http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

[31]Turbo-charging Java HotSpot Virtual Machine, v1.4.x toImprove the Performance and Scalability of Application Servers

http://java.sun.com/developer/technicalArticles/Programming/turbo/

[32]jvmstat 3.0 http://java.sun.com/performance/jvmstat/

[33]jvmstat FAQ http://java.sun.com/performance/jvmstat/faq.html

[34]HPROF: A Heap/CPU Profiling Tool in J2SE 5.0 http://java.sun.com/developer/technicalArticles/Programming/HPROF.html

[35]Quick Troubleshooting Tips on Windows for Java SE 5.0 http://java.sun.com/javase/6/webnotes/trouble/other/matrix5-Windows.html

[36]Quick Troubleshooting Tips on Solaris OS and Linux for Java SE5.0 http://java.sun.com/javase/6/webnotes/trouble/other/matrix5-Unix.html

[37]PerfAnal: A Performance Analysis Tool http://java.sun.com/developer/technicalArticles/Programming/perfanal/index.html

[38]Using JConsole to Monitor Applications http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html

[39]Monitoring and Management Using JMX  http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html

[40]Troubleshooting Guide for Java SE 6 with HotSpot VM http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/index.html

[41]Troubleshooting and Diagnostic Guide for JavaTM 2 Platform, StandardEdition 5.0http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf

 

IBM JVM资料

[50]IBMJDK 1.4.2的垃圾回收行为

(一) http://www-1.ibm.com/support/docview.wss?uid=csc1c4da5d7f9543bda44825717e00000759

(二) http://www-1.ibm.com/support/docview.wss?uid=csc1665d3ff3ebd54e0fc825719a0027c278

[51]优化 Java垃圾收集的性能  http://www.ibm.com/developerworks/cn/java/i-gctroub/

Fine-tuning Java garbagecollection performance http://www.ibm.com/developerworks/ibm/library/i-gctroub/?S_TACT=105AGX52&S_CMP=cn-a-j

[52]Mashthat trash -- Incremental compaction in the IBM JDK Garbage Collector

http://www.ibm.com/developerworks/ibm/library/i-incrcomp/?S_TACT=105AGX52&S_CMP=cn-a-j

[53]Sensible Sanitation -- Understanding the IBM Java GarbageCollector,

Part 1 Objectallocation http://www.ibm.com/developerworks/ibm/library/i-garbage1/

Part 2 Garbagecollection http://www.ibm.com/developerworks/ibm/library/i-garbage2/

Part 3 verbosegcand command-line parameters http://www.ibm.com/developerworks/library/i-garbage3.html

[54]Java 技术,IBM风格: 垃圾收集策略,第 1 部分 http://www.ibm.com/developerworks/cn/java/j-ibmjava2/

Java technology,IBM style: Garbage collection policies,

Part 1 http://www.ibm.com/developerworks/java/library/j-ibmjava2/

Part 2 http://www.ibm.com/developerworks/java/library/j-ibmjava3/

[55]如何在IBM JDK 1.4.2的环境中避免Java堆空间的碎片问题 http://www-900.ibm.com/cn/support/viewdoc/detail?DocId=2447476A10000

Avoiding Java heapfragmentation with V1_4_2

http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=fragmentation&uid=swg21176363&loc=en_US&cs=utf-8&lang=en

[56]IBM Developer Kit and Runtime Environment, Java 2Technology Edition, Version 1.4.2 Diagnostics Guide

http://www-128.ibm.com/developerworks/java/jdk/diagnosis/

[57]IBM Java诊断,

1部分: 介绍面向 Java IBM转储分析器(IBM Dump Analyzer http://www.ibm.com/developerworks/cn/java/j-ibmtools1/

2部分: 使用 Extensible Verbose Toolkit进行垃圾收集  http://www.ibm.com/developerworks/cn/java/j-ibmtools2/

3部分: 使用面向 Java LockAnalyzer诊断同步和锁问题   http://www.ibm.com/developerworks/cn/java/j-ibmtools3/

4部分: 使用分析模块扩展 IBM Dump Analyzer for Java  http://www.ibm.com/developerworks/cn/java/j-ibmtools4/

[58]WebSphere Application Server中的内存泄漏检测与分析:

1部分:内存泄漏概述   http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0606_poddar/0606_poddar.html

2部分:用于泄漏检测与分析的工具和功能  http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0608_poddar/0608_poddar.html

[59]Enabling verbose garbage collection (verbosegc) inWebSphere Application Server

  http://www-1.ibm.com/support/docview.wss?rs=180&uid=swg21114927

[60]Solving memory problems in WebSphere applications   http://www.ibm.com/developerworks/websphere/library/techarticles/0706_sun/0706_sun.html

[61]The Support Authority: Choosing the right WebSpherediagnostic tool

 http://www.ibm.com/developerworks/websphere/techjournal/0807_supauth/0807_supauth.html

[62]Preventing mark stack overflows during garbagecollection in the Java SDK

 http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&dc=DB520&uid=swg21164724&loc=en_US&cs=utf-8&lang=en

[63]IBM WebSphere V5.1 Performance, Scalability, and HighAvailability WebSphere Handbook Series

http://www.redbooks.ibm.com/abstracts/SG246198.html?Open

[64]IBM Developer Kit and Runtime Environment, JavaTechnology Edition, Version 5.0 Diagnostics Guide

http://www-128.ibm.com/developerworks/java/jdk/diagnosis/

[65]WebSphere Application Server V5.1 System Management andConfiguration WebSphere Handbook Series

http://www.redbooks.ibm.com/abstracts/sg246195.html?Open

[66]最大化 AIX上的 Java 性能

1部分: 基础 http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf1.html

2部分: 速度需求 http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf2.html

3部分: 更多就是更好 http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf3.html#resources

4部分: 监视流量 http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf4.html

5部分: 参考资料和结论 http://www.ibm.com/developerworks/cn/aix/library/es-Javaperf/es-Javaperf5.html


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值