[转]使用Java Mission Control进行内存分配分析
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中进行定制的分析接口。在进行分析之前,我们要花上几分钟来讨论下实际的事件。
首先,你需要确保事件已近被记录了。如果你使用默认的模板选项,你会发现内存分配分析选项默认是关闭的。要么打开它,或者使用分析模板而不要使用默认模板。内存分析选项默认关闭的原因是,它可能会产生太多的事件。并且对于不同的程序它的性能消耗是不确定的,因为不同的程序在内存分配的情况上是差别是很大的。
事件标签组中的Log标签是查看每个单独事件的绝佳地址。我们来看看这里包括了哪些内容:
这里包括已经分配的内存确切大小、导致内存分配的堆栈轨迹、分配内存的类和事件信息。在TLAB内存分配事件中,它们还包括分配的TLAB大小。
需要注意的是,TLAB的内存分配事件中并不是对应每一个地点的内存分配事件,那样太消耗资源了。取而代之的是,我们只在新的TLAB中第一次分配内存时进行事件上报。这意味着我们只获得了本地线程的内存分配一些排序后的样本。
此外,需要注意的是我们在JRockit中使用的TLA事件和在新生代中进行的分配是完全相同的,大对象分配事件和老生代内存分配时相同的。不过这些在HotSpot中有点复杂。TLAB外的内存分配事件既可以和年轻代内存回收分配相同,也可以和后续的Eden区及old区域的直接大对象分配相同。换句话说,如果你在TLAB事件外发现了一些少量的内存分配,你并不需要担心。正常来说,这种情况是非常的少见的。因此在实际情况中这些区分并不是那么明显。
使用Allocation标签页
Allocation(分配)标签页实际上包含三个子标签页:
- 通用
- 新TLAB分配
- TLAB外分配
通用标签页提供了一个总的视图和一些可用事件的统计信息,例如对于不同的事件类型分配的总内存。依据你首要目标的不同,对待这些信息的方式也会不同。下面的这个例子十分精简并且聚焦在内部TLAB分配,因为它更关注于总的内存分配压力。
新TLAB分配提供了三种以上专供于分析新TLAB分配事件的虚拟化类型:类级、线程级和分析级的分配。分析级分配是对这三种类型的一个简单的栈追踪集合。从下面的这个例子可以看出,Integer对象几乎占到整个系统的所有内存分配。在直方图中选择Integer类便会显示出对Integer对象的所有内存的栈轨迹集合,同时在这个例子中,所有的分配都来自同一个地点,正如下图展示的那样。

TLAB外分配的内存标签页和新TLAB标签页的工作原理相同,仅仅在这个时间点是一致的,当然这些是TLAB外的事件。

限制
因为新TLAB的内存分配事件仅仅只是总的线程本地内存分配的样本,仅仅只有一个事件是很难说明实际情况的。更多的事件才会有更精确的图片。此外,如果分配事件的行为在记录期间变化非常大,那么这样也很难建立一个十分有说服力本地内存分配视图。
原文链接: hirt 翻译: ImportNew.com- 潘 凌霄
译文链接: http://www.importnew.com/13346.html
[ 转载请保留原文出处、译者和译文链接。]
[转]使用Java Mission Control进行内存分配分析的更多相关文章
- Java 性能分析工具 , 第 3 部分: Java Mission Control
引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...
- Java 中数组的内存分配
Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
- Oracle Java Mission Control MBean 服务器 飞行记录器
Oracle Java Mission ControlMBean 服务器飞行记录器
- 《深入理解 java 虚拟机》学习 -- 内存分配
<深入理解 java 虚拟机>学习 -- 内存分配 1. Minor GC 和 Full GC 区别 概念: 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java ...
- MacOS下Java Mission Control无法正常启动
参考JMC(Java Mission Control)在mac下无法启动和显示界面 附件下载地址备份(org.eclipse.swt.cocoa.macosx.x86_64-3.112.0.jar) ...
- (转)java内存分配分析/栈内存、堆内存
转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...
- Java虚拟机7:内存分配原则
前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数 ...
- JAVA中堆栈和内存分配原理
1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...
随机推荐
- TCP三次握手及四次挥手详细 转
一.TCP报文格式 TCP/IP协议的详细信息参看<TCP/IP协议详解>三卷本.下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下: ...
- Linux_常用命令_01
PS:一些不涉及其他软件的操作,OS本来就支持的命令. 1.压缩/解压: 压缩: tar -zcvf /home/android1.6_cmdCompress.tar.gz /root/manifes ...
- 08 高效的SQL
编写高效 SQL 需要以下知识 有关所查询内容的物理组织的知识 数据库能做什么的知识, 例如: 如果你不知道跳跃扫描索引及其用途, 那么你可能会看着模式说”索引丢了” SQL 所有错综复杂的知识 对目 ...
- sscanf的用法(转)
队长做上海邀请赛的I题时遇到一个棘手的问题,字符串的处理很麻烦,按传统的gets全部读入的话还要做N多处理,太浪费时间. 回来之后搜了一下sscanf的用法发现可以很好的解决这一类问题,各种百度,转来 ...
- Python学习笔记3—字符串
原始字符串 使用\转义或者r,这种方法在网站设置网站目录结构的时候非常管用. >>> dos="c:\news" >>> print dos c ...
- Object Pascal 面向对象的特性
2 面向对象的特性 在软件系统开发过程中,结构分析技术和结构设计技术具有很多优点,但同时也存在着许多难以克服的缺点.因为结构分析技术和结构设计技术是围绕着实现处理功能来构造系统的,而在系统维护和软件升 ...
- ACM比赛经验
这篇博客是转别人的,觉得很好,希望能在以后的现场赛中用上:ACM比赛经验 推荐此篇文章打印,与模板放在一起. 1. 比赛中评测会有些慢,偶尔还会碰到隔10分钟以上才返回结果的情况,这段时间不能等结果, ...
- overflow:auto/hidden的应用
一.自适应两栏布局 <!DOCTYPE html><html lang="zh-CN"><head> <meta charset=&quo ...
- scp lost connection
将本机的文件copy到远程时, scp -r /home/Projects/test.rpm root@172.1.1.1:/root; 我们得到了一个错误:lost connection lost ...
- Java 创建xml文件和操作xml数据
java中的代码 import java.io.File; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; ...