`
RednaxelaFX
  • 浏览: 3020450 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

JDK6u25里添加的按线程统计分配内存量: JMX

    博客分类:
  • Java
阅读更多
Oracle几天前发布的JDK 6 update 25里添加的一个新功能非常有趣,可以按照线程来跟踪(GC堆)内存的分配量。这个功能在VM核心、解释器、C1编译器、C2编译器以及GC中都有代码支持,并且通过JMX API暴露出来。
不过新加的这功能不是加在java.开头的包里,而是加在com.sun.management.ThreadMXBean这个接口上,要用的话还得cast一下。

当然,这么底层的功能不可能没有代价。添加这个功能后,在GC堆上分配空间的slow-path会比以前稍微慢一些。但希望对整体性能的影响并不大吧。
Fast-path是在TLAB上分配空间的,而TLAB的分配数据是在TLAB refill的时候才批量更新,所以这个功能对fast-path的执行效率基本上没影响,以稍微放宽数据精准性为代价。

相关链接:
Bug ID 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
changeset

JMX中,该功能由ThreadMXBean上新增的几个方法提供。详情可见下面例子。
ThreadMXBean.getThreadAllocatedBytes(long threadId)的用法基本上可以看成跟System.currentTimeMillis()用于计时的用法一样,在两点上记录并且求差即可。

不知道为什么JVMTI没得到这个更新,或许是因为更新JVMTI spec涉及committee stuff?

==============================================================

直接拿一段Groovy脚本来演示吧:

先看JDK 6 update 24的情况
D:\sdk\groovy-1.7.2\bin>groovysh
Groovy Shell (1.7.2, JVM: 1.6.0_24)
Type 'help' or '\h' for help.
-------------------------------------------------------------------------------
groovy:000> import java.lang.management.*
===> [import java.lang.management.*]
groovy:000> tb = ManagementFactory.threadMXBean
===> sun.management.ThreadImpl@8b677f
groovy:000> tb.class.methods.name.unique().sort()
===> [dumpAllThreads, equals, findDeadlockedThreads, findMonitorDeadlockedThreads, getAllThreadIds, getClass, getCurrentThreadCpuTime, getCurrentThreadUserTime, getDaemonThreadCount, getPeakThreadCount, getThreadCount, getThreadCpuTime, getThreadInfo, getThreadUserTime, getTotalStartedThreadCount, hashCode, isCurrentThreadCpuTimeSupported, isObjectMonitorUsageSupported, isSynchronizerUsageSupported, isThreadContentionMonitoringEnabled, isThreadContentionMonitoringSupported, isThreadCpuTimeEnabled, isThreadCpuTimeSupported, notify, notifyAll, resetPeakThreadCount, setThreadContentionMonitoringEnabled, setThreadCpuTimeEnabled, toString, wait]
groovy:000> tb.class.methods.findAll { it.name =~ /Alloc/}.each { println it }; null
===> null

这个时候ThreadMXBean上还没有跟alloc相关的方法。

D:\sdk\groovy-1.7.2\bin>groovysh
Groovy Shell (1.7.2, JVM: 1.6.0_25)
Type 'help' or '\h' for help.
-------------------------------------------------------------------------------
groovy:000> import java.lang.management.*
===> [import java.lang.management.*]
groovy:000> tb = ManagementFactory.threadMXBean
===> sun.management.ThreadImpl@9b1670
groovy:000> tb.class.methods.name.unique().sort()
===> [dumpAllThreads, equals, findDeadlockedThreads, findMonitorDeadlockedThreads, getAllThreadIds, getClass, getCurrentThreadCpuTime, getCurrentThreadUserTime, getDaemonThreadCount, getPeakThreadCount, getThreadAllocatedBytes, getThreadCount, getThreadCpuTime, getThreadInfo, getThreadUserTime, getTotalStartedThreadCount, hashCode, isCurrentThreadCpuTimeSupported, isObjectMonitorUsageSupported, isSynchronizerUsageSupported, isThreadAllocatedMemoryEnabled, isThreadAllocatedMemorySupported, isThreadContentionMonitoringEnabled, isThreadContentionMonitoringSupported, isThreadCpuTimeEnabled, isThreadCpuTimeSupported, notify, notifyAll, resetPeakThreadCount, setThreadAllocatedMemoryEnabled, setThreadContentionMonitoringEnabled, setThreadCpuTimeEnabled, toString, wait]
groovy:000> tb.class.methods.findAll { it.name =~ /Alloc/}.each { println it };
null
public boolean sun.management.ThreadImpl.isThreadAllocatedMemoryEnabled()
public boolean sun.management.ThreadImpl.isThreadAllocatedMemorySupported()
public long[] sun.management.ThreadImpl.getThreadAllocatedBytes(long[])
public long sun.management.ThreadImpl.getThreadAllocatedBytes(long)
public void sun.management.ThreadImpl.setThreadAllocatedMemoryEnabled(boolean)
===> null
groovy:000> tb.threadAllocatedMemoryEnabled
===> true
groovy:000> tid = Thread.currentThread().id
===> 1
groovy:000> tb.getThreadAllocatedBytes(tid)
===> 48106672
groovy:000> tb.getThreadAllocatedBytes(tid)
===> 48751520
groovy:000> tb.getThreadAllocatedBytes(tid)
===> 49384752
groovy:000> tb.getThreadAllocatedBytes(tid)
===> 50086240
groovy:000> quit
分享到:
评论
2 楼 xieyuNL 2013-07-23  
补充了下测试,发现在JDK 1.7下面没有问题(update 25 64bit windows),当我申请的字符串变大的时候,得到的结果会有变化,JDK 1.6下面我发现无论怎么修改字符串的内容长度,统计出来的结果都没啥变化(update 45 64bit windows)
1 楼 xieyuNL 2013-07-23  
大R,请教个问题,我用这中方式统计了下当前线程的内存,估计在当前线程的前面创建对象,创建的是new String(),奇怪的是,new String()的内容加长的时候,统计出来的结果没有任何变化,不明白原因,麻烦请教下是不是有什么细节需要注意下。

相关推荐

    深入浅出JDK 源码

    深入讲解如何利用JDK提供的API进行应用开发,如输入输出、线程、图形界面、数据库存取、XML等,详细阐述Java语言的高级开发技巧,如分布式计算、本地调用、Annotation、反射、动态代理、JMX等。

    java利用JMX做出不一样的的JVM.docx

    最常用到的就是对于 JVM 的监测和管理,比如 JVM 内存、CPU 使用率、线程数、垃圾收集情况等等。另外,还可以用作日志级别的动态修改,比如 log4j 就支持 JMX 方式动态修改线上服务的日志级别。最主要的还是被用来做...

    asf.zip_java jmx jconsole_remote

    JDK1.5提供JMX remote的管理工具Jconsole,可以监控Java运行程序的内存使用情况、活动线程数量、类装载的数量、MBeans的状态、虚拟机的各种信息等,还可以执行MBean公开的方法或强制进行垃圾回收。只要应用服务器...

    JConsole_远程监控Tomcat_ricky

    JConsole能够提供被监控虚拟机的内存、线程、类的加载以及MBean等信息,从而能够对服务器的运行情况进行实时监控。 其实在 JDK 5 中已经新加入了这个功能了. 现在的 JDK 已经内置了对 VM 的监控功能. JDK 6 中这个...

    JDK_1_6 API

    JAVA开发人员必备是HTML格式的 JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 ... org.omg.CORBA_2_3 CORBA_2_3 包定义对 Java[tm] Standard Edition 6 中现有 CORBA 接口所进行的添加。 org.omg.CORBA_2_...

    java jdk-api-1.6 中文 chmd

    java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...

    [Java参考文档].JDK_API 1.6

    本文档是 JavaTM Platform Standard Edition 6 的 API 规范。 Java SE Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制...

    java8集合源码分析-geektime-java-week-training-camp:极客时间-Java每周训练营

    的线程堆栈等数据分析、内存 dump 和内存分析工具; fastThread 相关工具以及面临复杂问题时的几个高级工具的使用; JVM 问题排查分析的常用手段、性能调优的最佳实践经验等; JVM 相关的常见面试问题必知必会、全面...

    C3P0中文文档说明

    项目在jmx管理和本身死锁监测,做的都比较精彩,但也有它不足支持,jdk1.5提供了很多功能(比如多线程),它很多都是自己实现了,这就要看作者怎么对待这个项目 目前给我的感觉有点象当年的dom4j感觉,毕竟都需要谋生,...

    Logback用户手册中文版

    3.1. Logback 里的配置 ..................................................................................... 17 3.2. 自动配置...............................................................................

    java api最新7.0

    里面列出了Java jdk 1.7的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有...

    Java 1.6 API 中文 New

    本文档是 Java Platform Standard Edition 6 的 API !Java 1.6 API的中文帮助文档。 深圳电信培训中心徐海蛟博士教学用api中文文档。支持全文检索,在线即时查询。 里面列出了,Java的所有类及其使用方法! Java ...

    [Java参考文档]

    jdk_api_1_6帮助开发 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 ...

Global site tag (gtag.js) - Google Analytics