- 浏览: 3049198 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
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的情况
这个时候ThreadMXBean上还没有跟alloc相关的方法。
不过新加的这功能不是加在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()的内容加长的时候,统计出来的结果没有任何变化,不明白原因,麻烦请教下是不是有什么细节需要注意下。
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16278以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10453先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22396(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21874之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48367刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
- **性能优化**:JDK-6u21对虚拟机(JVM)进行了调整,提升了程序运行速度,尤其是对于多线程应用的优化。 - **类库增强**:可能包含了一些新的API或者对现有API的增强,以提供更多的功能和便利性。 3. **Windows...
这个特定的版本,"jdk-8u65-windows-x64",是针对Windows操作系统64位平台的JDK 1.8更新65(也称为8u65)。它包含了Java编译器(javac)、解释器(java)、JRE(Java Runtime Environment)、调试器(jdb)以及其他...
《Java开发工具包(JDK)8u131在Windows x64平台上的应用详解》 Java开发工具包(Java Development Kit,简称JDK)是Oracle公司提供的用于开发和运行Java应用程序的重要软件包,是Java程序员的标准开发环境。本文将...
Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。Oracle JDK是Oracle公司提供的官方版本,具有高质量的性能和稳定性,是...
标题 "jdk-6u32-linux-x64.zip" 暗示了这是一个包含Java Development Kit(JDK)的压缩文件,具体版本为6更新32(6u32),适用于Linux操作系统,且是针对64位(x64)架构的。JDK是Java编程语言开发和运行环境的核心...
1. 应用程序监控:JMX可以用来监控Java应用程序的性能、内存使用情况、线程状态等信息。 2. 远程管理:JMX可以用来远程管理Java应用程序,例如远程启动、停止、重启应用程序。 3. 故障诊断:JMX可以用来诊断Java应用...
可以通过JDK自带的JMX(Java Management Extensions)和JConsole等工具,或者第三方工具如VisualVM、JProfiler等来监控CPU使用率、内存占用、线程状态等指标,以确保服务器的健康运行。 总之,毕昇JDK 8u322 Linux ...
1. **解压与授权**: 首先,需要给bin文件添加执行权限:`chmod +x jdk-6u45-linux-x64.bin`。 2. **运行安装脚本**: 接下来,执行安装命令:`./jdk-6u45-linux-x64.bin`,这会在当前目录下创建一个名为`jdk1.6.0_45...
6. **核心技术文档**:这部分包含了如Garbage Collection、JMX(Java Management Extensions)、JNDI(Java Naming and Directory Interface)等Java核心技术的详细信息,对于优化程序性能和进行系统管理具有重要...
1. JVM架构:理解JVM的内存模型、类加载机制、垃圾收集、线程调度等基础概念。 2. 字节码与编译器:研究JVM如何执行字节码,以及如何通过C1和C2编译器进行即时编译优化。 3. 类库实现:深入源码,探索ArrayList、...
除此之外,JDK1.6还对垃圾收集机制进行了优化,提高了内存管理效率,并引入了新的诊断工具和JMX(Java Management Extensions)改进,方便系统管理和监控。 总的来说,"jdk6-x64.zip"是一个针对64位Windows系统的...
VisualVM提供了丰富的功能,包括内存分析、线程检查、CPU使用率监测、类加载和垃圾收集信息等,帮助开发者深入理解应用的运行状况。 在JDK中,VisualVM通常可以通过`jvisualvm`命令在命令行启动。它集成了多个JDK...
在Linux环境下,解压"jdk-8u191-linux-x64.tar.gz"后,通常需要将JDK的bin目录添加到PATH环境变量中,以便于在任何位置执行Java命令。"版本说明.txt"文件可能包含了关于这个版本的一些详细信息,包括变更日志、新...
堆内存细分为新生代(Young Generation)和老年代(Old Generation),每个区域的使用量、最大容量、已分配容量等数据均被记录下来;非堆内存则主要关注代码缓存、元空间(Metaspace)等部分。 3. **Threads Tab**...
连接成功后,JVisualVM会显示与Tomcat相关的各种监控信息,包括CPU使用率、内存分配、线程状态、类加载情况等。你可以实时查看这些数据,帮助识别和解决性能瓶颈。 总的来说,通过开启Tomcat的JMX功能并利用...
1. 堆内存状态:查看堆内存的总量、空闲量和已使用量,以及内存分配情况。 2. 内存管理:监控垃圾收集(Garbage Collection, GC)活动,包括GC执行频率和暂停时间,这些对于理解应用性能瓶颈至关重要。 监控Tomcat...
6. **JMX(Java Management Extensions)增强**:JMX在JDK1.6中更加成熟,能够更方便地管理和监控Java应用。 7. **并发编程工具**:提供如ConcurrentHashMap等并发集合类,帮助开发者编写更高效、线程安全的代码。 ...
JDK6,也称为Java SE 6,是Java的一个重要版本,发布于2006年,包含了许多新特性和改进,对开发者来说具有重要的历史地位。由于它已经不再接受官方更新和支持,因此对于新手开发者或者寻求最新功能的人来说,可能不...
JDK 6的调试工具得到了增强,包括更好的线程管理和内存分析,以及对Java SE 6新特性的支持。 8. **编译器优化**: - **泛型注解处理**:编译器支持了对泛型类型的注解处理,增强了类型安全。 - **编译器API**:...