`
RednaxelaFX
  • 浏览: 3049229 次
  • 性别: 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-6u21-Windows版

    - **性能优化**:JDK-6u21对虚拟机(JVM)进行了调整,提升了程序运行速度,尤其是对于多线程应用的优化。 - **类库增强**:可能包含了一些新的API或者对现有API的增强,以提供更多的功能和便利性。 3. **Windows...

    jdk-8u65-windows-x64

    这个特定的版本,"jdk-8u65-windows-x64",是针对Windows操作系统64位平台的JDK 1.8更新65(也称为8u65)。它包含了Java编译器(javac)、解释器(java)、JRE(Java Runtime Environment)、调试器(jdb)以及其他...

    jdk-8u131-windows-x64.rar

    《Java开发工具包(JDK)8u131在Windows x64平台上的应用详解》 Java开发工具包(Java Development Kit,简称JDK)是Oracle公司提供的用于开发和运行Java应用程序的重要软件包,是Java程序员的标准开发环境。本文将...

    jdk-8u71-windows-x64.exe

    Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。Oracle JDK是Oracle公司提供的官方版本,具有高质量的性能和稳定性,是...

    jdk-6u32-linux-x64.zip

    标题 "jdk-6u32-linux-x64.zip" 暗示了这是一个包含Java Development Kit(JDK)的压缩文件,具体版本为6更新32(6u32),适用于Linux操作系统,且是针对64位(x64)架构的。JDK是Java编程语言开发和运行环境的核心...

    JDK11-java-management-extensions-guide.pdf

    1. 应用程序监控:JMX可以用来监控Java应用程序的性能、内存使用情况、线程状态等信息。 2. 远程管理:JMX可以用来远程管理Java应用程序,例如远程启动、停止、重启应用程序。 3. 故障诊断:JMX可以用来诊断Java应用...

    bisheng-jdk-8u322-linux-x64.tar.gz

    可以通过JDK自带的JMX(Java Management Extensions)和JConsole等工具,或者第三方工具如VisualVM、JProfiler等来监控CPU使用率、内存占用、线程状态等指标,以确保服务器的健康运行。 总之,毕昇JDK 8u322 Linux ...

    jdk-6u45-linux-x64

    1. **解压与授权**: 首先,需要给bin文件添加执行权限:`chmod +x jdk-6u45-linux-x64.bin`。 2. **运行安装脚本**: 接下来,执行安装命令:`./jdk-6u45-linux-x64.bin`,这会在当前目录下创建一个名为`jdk1.6.0_45...

    jdk-8u191-docs-all.zip

    6. **核心技术文档**:这部分包含了如Garbage Collection、JMX(Java Management Extensions)、JNDI(Java Naming and Directory Interface)等Java核心技术的详细信息,对于优化程序性能和进行系统管理具有重要...

    jdk8u-jdk-master

    1. JVM架构:理解JVM的内存模型、类加载机制、垃圾收集、线程调度等基础概念。 2. 字节码与编译器:研究JVM如何执行字节码,以及如何通过C1和C2编译器进行即时编译优化。 3. 类库实现:深入源码,探索ArrayList、...

    jdk6-x64.zip

    除此之外,JDK1.6还对垃圾收集机制进行了优化,提高了内存管理效率,并引入了新的诊断工具和JMX(Java Management Extensions)改进,方便系统管理和监控。 总的来说,"jdk6-x64.zip"是一个针对64位Windows系统的...

    visualvm jdk插件

    VisualVM提供了丰富的功能,包括内存分析、线程检查、CPU使用率监测、类加载和垃圾收集信息等,帮助开发者深入理解应用的运行状况。 在JDK中,VisualVM通常可以通过`jvisualvm`命令在命令行启动。它集成了多个JDK...

    jdk-8u191-linux.zip

    在Linux环境下,解压"jdk-8u191-linux-x64.tar.gz"后,通常需要将JDK的bin目录添加到PATH环境变量中,以便于在任何位置执行Java命令。"版本说明.txt"文件可能包含了关于这个版本的一些详细信息,包括变更日志、新...

    Jconsole JDK自带的监控程序

    堆内存细分为新生代(Young Generation)和老年代(Old Generation),每个区域的使用量、最大容量、已分配容量等数据均被记录下来;非堆内存则主要关注代码缓存、元空间(Metaspace)等部分。 3. **Threads Tab**...

    Tomcat开启JMX功能,使jdk自带的JVisvualVM工具连接JVM,轻松进行性能分析(csdn)————.pdf

    连接成功后,JVisualVM会显示与Tomcat相关的各种监控信息,包括CPU使用率、内存分配、线程状态、类加载情况等。你可以实时查看这些数据,帮助识别和解决性能瓶颈。 总的来说,通过开启Tomcat的JMX功能并利用...

    Monitoring Apache Tomcat with JMX.pdf

    1. 堆内存状态:查看堆内存的总量、空闲量和已使用量,以及内存分配情况。 2. 内存管理:监控垃圾收集(Garbage Collection, GC)活动,包括GC执行频率和暂停时间,这些对于理解应用性能瓶颈至关重要。 监控Tomcat...

    32位jdk1.6

    6. **JMX(Java Management Extensions)增强**:JMX在JDK1.6中更加成熟,能够更方便地管理和监控Java应用。 7. **并发编程工具**:提供如ConcurrentHashMap等并发集合类,帮助开发者编写更高效、线程安全的代码。 ...

    jdk6免安装版本, 解压直接使用

    JDK6,也称为Java SE 6,是Java的一个重要版本,发布于2006年,包含了许多新特性和改进,对开发者来说具有重要的历史地位。由于它已经不再接受官方更新和支持,因此对于新手开发者或者寻求最新功能的人来说,可能不...

    jdk6新特性介绍

    JDK 6的调试工具得到了增强,包括更好的线程管理和内存分析,以及对Java SE 6新特性的支持。 8. **编译器优化**: - **泛型注解处理**:编译器支持了对泛型类型的注解处理,增强了类型安全。 - **编译器API**:...

Global site tag (gtag.js) - Google Analytics