jdk7u40自带了一个非常好用的工具,就是Java Mission Control。JRockit Misson Control用户应该会对mission control的很多功能十分熟悉,JRockit也是一款很棒的工具。本篇文章将着重关注如何使用Java Flight Recorder进行内存分配分析。
jvm有着非常棒的小块内存虚拟化技术,这会让你产生一种拥有无限内存的错觉感,其实它的开销非常大。有时候jvm需要找出此刻堆上数据是如何被使用的,并把剩余的空间扩大——这就是垃圾回收。产生这种情况的原因是,jvm实际获得的物理内存是有限的,因此需要在不被使用时进行内存回收和复用。在一些时间敏感的应用中,比如交易系统和通信程序,这些暂停是不能容忍的。有很多GC调优方法可以避免这种暂停发生。貌似上面的讨论已经跑题了。让GC变少的方法当然是尽量减少分配内存。
有时候,你希望找出在你的程序中哪些地方导致了内存分配的压力。引起这种压力的原因有很多种。最普通的一种情况可能是jvm需要经常GC,并且时间远超过你认为的合理值。
JFR分配事件
在HotSpot7u40中实现的Java Flight Recorder(JFR)有两种内存分配事件可以帮助我们找出程序中进行内存分配的地方:TLAB中的内存分配和TLAB外的内存分配事件。
与JDK提供的其它大多数事件相类似,有一系列可在Mission Control中进行定制的分析接口。在进行分析之前,我们要花上几分钟来讨论下实际的事件。
首先,你需要确保事件已近被记录了。如果你使用默认的模板选项,你会发现内存分配分析选项默认是关闭的。要么打开它,或者使用分析模板而不要使用默认模板。内存分析选项默认关闭的原因是,它可能会产生太多的事件。并且对于不同的程序它的性能消耗是不确定的,因为不同的程序在内存分配的情况上是差