jdk7u40自带了一个非常好用的工具,就是Java Mission ControlJRockit 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(分配)标签页实际上包含三个子标签页:

  1. 通用
  2. 新TLAB分配
  3. TLAB外分配

通用标签页提供了一个总的视图和一些可用事件的统计信息,例如对于不同的事件类型分配的总内存。依据你首要目标的不同,对待这些信息的方式也会不同。下面的这个例子十分精简并且聚焦在内部TLAB分配,因为它更关注于总的内存分配压力。

新TLAB分配提供了三种以上专供于分析新TLAB分配事件的虚拟化类型:类级、线程级和分析级的分配。分析级分配是对这三种类型的一个简单的栈追踪集合。从下面的这个例子可以看出,Integer对象几乎占到整个系统的所有内存分配。在直方图中选择Integer类便会显示出对Integer对象的所有内存的栈轨迹集合,同时在这个例子中,所有的分配都来自同一个地点,正如下图展示的那样。

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

限制

因为新TLAB的内存分配事件仅仅只是总的线程本地内存分配的样本,仅仅只有一个事件是很难说明实际情况的。更多的事件才会有更精确的图片。此外,如果分配事件的行为在记录期间变化非常大,那么这样也很难建立一个十分有说服力本地内存分配视图。

原文链接: hirt 翻译: ImportNew.com潘 凌霄
译文链接: http://www.importnew.com/13346.html
转载请保留原文出处、译者和译文链接。]

[转]使用Java Mission Control进行内存分配分析的更多相关文章

  1. Java 性能分析工具 , 第 3 部分: Java Mission Control

    引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...

  2. Java 中数组的内存分配

    Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...

  3. java程序运行时内存分配详解

    java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下   一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...

  4. Oracle Java Mission Control MBean 服务器 飞行记录器

    Oracle Java Mission ControlMBean 服务器飞行记录器

  5. 《深入理解 java 虚拟机》学习 -- 内存分配

    <深入理解 java 虚拟机>学习 -- 内存分配 1. Minor GC 和 Full GC 区别 概念: 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java ...

  6. MacOS下Java Mission Control无法正常启动

    参考JMC(Java Mission Control)在mac下无法启动和显示界面 附件下载地址备份(org.eclipse.swt.cocoa.macosx.x86_64-3.112.0.jar) ...

  7. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

  8. Java虚拟机7:内存分配原则

    前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数 ...

  9. JAVA中堆栈和内存分配原理

    1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

随机推荐

  1. python selenium 操作chrome

    1.下载chromedriver.exe 入在chrome 浏览器目录下 from selenium import webdriverimport os chromedriver = "C: ...

  2. testlink简单部署

    CentOS+LAMP+testlink 环境 系统 CentOS6.5 软件 testlink-1.9.14 IP 192.168.0.158 部署 LAMP环境搭建 remi配置 wget htt ...

  3. kali安装vmware tools

    昨天在网上搜了半天如何在kail下安装tools工具,结果都没有成功,今天就来说说我是怎么安装成功的. 1.按照网上的办法只能到这一步,一直提示找不到路径,点了回车也会照常出现这样的情况. Searc ...

  4. 两种方法获取shadow ssdt

    ULONG GetShadowSsdtCurrentAddresses( PSSDT_ADDRESS   AddressInfo, PULONG          Length ) { PSYSTEM ...

  5. CentOS 安装nagios

    Nagios的介绍: 1.Nagios是一个监控系统运行状态和网络信息的监控系统.它能监控所指定的本地或远程主机的系统状态以及运行的服务,同时提供异常通知的功能. 2. Nagios可运行在Linux ...

  6. 在Visual Studio中使用GitHub(使用篇)

    一.准备工具 上一篇中我们已经安装了Git Extensions和Tortoisegit.在这里我们要为Visual Studio安装一个插件,专门用于Git. Git Source Control ...

  7. IT技术如何转向销售创业

    广州 IT 网友  14:14:10 本人本科软件工程毕业,现在在一家公司做开发(不是很技术的那种),工作接近两年感觉自 己不适合这个行业,想换销售行业,不愿意在做技术.打算从事本行业的销售,老师给点 ...

  8. c# 16进制大端小端解析长度

    //前两个字节为长度的解析string hexstr = "00 13 59 02 80 00 E7 00 80 00 E9 00 80 00 EA 00 80 00 EB 00 80&qu ...

  9. git学习手记(也许仅对本人有用)

    首先明白git的三种状态 commited已提交 =====>git仓库(存着各种版本)modified已修改(此时就是我们的编辑器中的未保存状态)====>工作目录staged暂存状态= ...

  10. 为什么我的mac插入耳机耳机没有声音呢?

    macOS 系统莫名其妙就遇到声音和音频播放问题的情况相当普遍,在新添音频设备.应用程序之间进行切换或更新操作系统后,都可能会遇到音频错误.好加在,解决大多数 macOS 声音无法正常工作的方法都非常 ...