- 浏览: 3052577 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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分享的概要
写了个工具用来把一个运行中的HotSpot VM中所有加载了的类的:
类名, ProtectionDomain的CodeSource所记录的路径, 类加载器
这些信息打印出来。希望对大家有用。
代码:https://gist.github.com/1441625#file_dump_class_url.java
用法:https://gist.github.com/1441625#file_command_prompt
(注意:Windows上用这个需要JDK7或以上)
输出日志的例子:https://gist.github.com/1441625#file_log.txt
这工具的缺点是ProtectionDomain是里没记录某些类的路径,例如rt.jar里的在这个工具的输出就是null。Bootstrap class loader加载的类都会是这样。
另外,数组对应的Class与原始类型对应的Class都不包括在输出之内。
得感谢同事九任提醒可以通过ProtectionDomain拿到路径信息,虽然不保证全但也算够用。
这是个很简单的Serviceability Agent的应用。用它能很轻松的从VM里挖掘出许多有趣的信息出来。我常用的CLHSDB也是Serviceability Agent的一层皮,相当方便。
以前也在这个blog里发过几个例子:
2010-08-05: 借助HotSpot SA来一窥PermGen上的对象
2010-08-04: 借助HotSpot SA来反汇编
2010-08-03: 如何dump出一个Java进程里的类对应的Class文件?
跟同事的一段对话:
P.S. 有同学问为啥不用Attach API来做,于是就用Attach API又做了一个:https://gist.github.com/1442201
使用这个工具必须设置JAVA_HOME环境变量。它的输出是在目标Java进程的stdout上(就像对HotSpot发kill -3一样…)
奇怪的是在我们的线上环境用Attach API没能正常把agent接上去。我现在还不知道为什么。
R大,难倒agentmain会被虚拟机回调很多次吗?我想动态随时查询虚拟机里加载的类信息。
要看多少次就执行多少次attach嘛,每次attach都会让那个agent新初始化一次,于是agentmain就被调了。那个agent执行完agentmain就退出了,影响不大。
不是。instrumentation API里的getAllLoadedClasses不是在类加载的时候才起作用的。这两种方法走到最底下其实做的事情一样,都是遍历当前HotSpot VM里的SystemDictionary。
R大,难倒agentmain会被虚拟机回调很多次吗?我想动态随时查询虚拟机里加载的类信息。
不是。instrumentation API里的getAllLoadedClasses不是在类加载的时候才起作用的。这两种方法走到最底下其实做的事情一样,都是遍历当前HotSpot VM里的SystemDictionary。
你得说得更详细才行。这段描述我看不出来你的问题点是什么。
类名, ProtectionDomain的CodeSource所记录的路径, 类加载器
这些信息打印出来。希望对大家有用。
代码:https://gist.github.com/1441625#file_dump_class_url.java
用法:https://gist.github.com/1441625#file_command_prompt
(注意:Windows上用这个需要JDK7或以上)
输出日志的例子:https://gist.github.com/1441625#file_log.txt
这工具的缺点是ProtectionDomain是里没记录某些类的路径,例如rt.jar里的在这个工具的输出就是null。Bootstrap class loader加载的类都会是这样。
另外,数组对应的Class与原始类型对应的Class都不包括在输出之内。
得感谢同事九任提醒可以通过ProtectionDomain拿到路径信息,虽然不保证全但也算够用。
这是个很简单的Serviceability Agent的应用。用它能很轻松的从VM里挖掘出许多有趣的信息出来。我常用的CLHSDB也是Serviceability Agent的一层皮,相当方便。
以前也在这个blog里发过几个例子:
2010-08-05: 借助HotSpot SA来一窥PermGen上的对象
2010-08-04: 借助HotSpot SA来反汇编
2010-08-03: 如何dump出一个Java进程里的类对应的Class文件?
跟同事的一段对话:
引用
同事A (15:26:42):
这个太有用了
同事B (15:30:01):
这个路径是指class文件在文件系统中的路径么?
我 (15:30:48):
这个路径是ProtectionDomain里的CodeSource记录的路径。不一定真的是文件系统上的路径,但一般是的
ProtectionDomain里CodeSource的路径是可以造出来的
我 (15:31:54):
但只有用比较特别的类加载器的时候才会用到这功能
同事B (15:32:51):
JVM记录了他加载的全部类的class文件位置么?
我 (15:33:05):
不一定。
简单来说,我们常用的场景的类的路径是有记录的,就是在上面说的那里
同事B (15:34:08):
这部分信息对排错太有意义了
我 (15:34:51):
如果有同名的类被加载了多次的话,这个工具的输出里能很快看出来
...
同事C (15:48:05):
恩 是的 被这种问题折磨过的人 都是深有体会的,前几天找个commonloging的问题 开发人员说daily跟线上用的版本是一样的 我也没仔细看 就直接debug 发现代码完全是走别的版本的 搞了半个小时才弄好这个问题
这个工具的话 一下子就可以解决这样的问题了
这个太有用了
同事B (15:30:01):
这个路径是指class文件在文件系统中的路径么?
我 (15:30:48):
这个路径是ProtectionDomain里的CodeSource记录的路径。不一定真的是文件系统上的路径,但一般是的
ProtectionDomain里CodeSource的路径是可以造出来的
我 (15:31:54):
但只有用比较特别的类加载器的时候才会用到这功能
同事B (15:32:51):
JVM记录了他加载的全部类的class文件位置么?
我 (15:33:05):
不一定。
简单来说,我们常用的场景的类的路径是有记录的,就是在上面说的那里
同事B (15:34:08):
这部分信息对排错太有意义了
我 (15:34:51):
如果有同名的类被加载了多次的话,这个工具的输出里能很快看出来
...
同事C (15:48:05):
恩 是的 被这种问题折磨过的人 都是深有体会的,前几天找个commonloging的问题 开发人员说daily跟线上用的版本是一样的 我也没仔细看 就直接debug 发现代码完全是走别的版本的 搞了半个小时才弄好这个问题
这个工具的话 一下子就可以解决这样的问题了
P.S. 有同学问为啥不用Attach API来做,于是就用Attach API又做了一个:https://gist.github.com/1442201
使用这个工具必须设置JAVA_HOME环境变量。它的输出是在目标Java进程的stdout上(就像对HotSpot发kill -3一样…)
奇怪的是在我们的线上环境用Attach API没能正常把agent接上去。我现在还不知道为什么。
评论
6 楼
RednaxelaFX
2011-12-13
panggezi 写道
R大,难倒agentmain会被虚拟机回调很多次吗?我想动态随时查询虚拟机里加载的类信息。
要看多少次就执行多少次attach嘛,每次attach都会让那个agent新初始化一次,于是agentmain就被调了。那个agent执行完agentmain就退出了,影响不大。
5 楼
panggezi
2011-12-13
RednaxelaFX 写道
panggezi 写道
还是前一种好,后一种agentmain太弱了,对于容器之类很多随着运行runtime动态加载的应该就打印不出来了吧
不是。instrumentation API里的getAllLoadedClasses不是在类加载的时候才起作用的。这两种方法走到最底下其实做的事情一样,都是遍历当前HotSpot VM里的SystemDictionary。
R大,难倒agentmain会被虚拟机回调很多次吗?我想动态随时查询虚拟机里加载的类信息。
4 楼
RednaxelaFX
2011-12-12
panggezi 写道
还是前一种好,后一种agentmain太弱了,对于容器之类很多随着运行runtime动态加载的应该就打印不出来了吧
不是。instrumentation API里的getAllLoadedClasses不是在类加载的时候才起作用的。这两种方法走到最底下其实做的事情一样,都是遍历当前HotSpot VM里的SystemDictionary。
3 楼
panggezi
2011-12-12
还是前一种好,后一种agentmain太弱了,对于容器之类很多随着运行runtime动态加载的应该就打印不出来了吧
2 楼
RednaxelaFX
2011-12-11
agapple 写道
不错,我有个想法是想运行时提取内存对象的数据用于一些deadlock分析,但attach上去生存的类classloader和目标对象不是同一个,这有什么好的idea吗?
你得说得更详细才行。这段描述我看不出来你的问题点是什么。
1 楼
agapple
2011-12-11
不错,我有个想法是想运行时提取内存对象的数据用于一些deadlock分析,但attach上去生存的类classloader和目标对象不是同一个,这有什么好的idea吗?
发表评论
-
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 16290以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10465先看看下面这个代码例子, 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 ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
tailcall notes
2013-12-27 07:42 0http://blogs.msdn.com/b/clrcode ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22408(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21508(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 21884之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ...
相关推荐
- `-hotspot`:使用HotSpot VM(与-server相同)。 - `-cp <类搜索路径>`:设置类路径,与`-classpath`相同。 - `-classpath <类搜索路径>`:设置类路径。 - `-D<名称>=<值>`:设置系统属性。 - `-verbose[:...
每当当前工作目录(或其子目录)中的.class文件更改时,Agent7都会在所有类加载器中重新加载相应的类。 DCEVM Agent7可以与普通Java一起运行。 但是,它旨在与一起使用。 动态代码演化虚拟机(DCE VM)是对Java ...
- **Application ClassLoader**(应用程序类加载器):也称为系统类加载器,同样由Java编写,负责加载用户类路径(`CLASSPATH`)所指定的类库。 #### 三、运行时数据区(RunDataArea) 运行时数据区是JVM管理的主要...
- **系统类装载器**:也叫应用类装载器,加载用户类路径上的类。 - **自定义类装载器**:允许开发者实现自己的类加载策略。 8. **线程安全问题**: - **volatile**:保证可见性和有序性,但不保证原子性。 - **...
- 类加载器分为系统类加载器、扩展类加载器和引导类加载器等不同层级,每种类加载器都有特定的功能。 3. **运行时数据区(Runtime Data Areas)** - 包括方法区、堆、栈等区域,这些区域在JVM启动时创建,并在整个...
6. **类加载器体系结构**:包括启动类加载器、扩展类加载器、系统类加载器和用户自定义加载器,它们按层次负责不同路径下的类加载。 7. **运行时数据区**:包括堆、栈、本地方法栈、PC寄存器和元数据区。堆是所有...
根据提供的文件信息,我们可以了解到这是关于一个特定版本的 `jvm.dll` 文件的讨论,该文件位于 `C:\Program Files\Oracle\JInitiator 1.3.1.21\bin\hotspot` 目录下,并且被标记为“老版本”。接下来,我们将深入...
- 更改了类路径和模块路径的处理方式,使得模块化系统的引入更加平滑。 - 提供了私有接口方法,允许接口内定义私有方法。 JVM规范(Java Virtual Machine Specification, JVMS)则描述了Java虚拟机的架构、指令集...
3. **研究关键组件**:深入学习 HotSpot 虚拟机、类加载器、垃圾收集器、内存模型等核心组件。 4. **追踪代码**:选择一个感兴趣的 Java 类或方法,追踪其在源码中的实现,理解其工作原理。 5. **参与社区**:加入 ...
【Java GC on HP-UX Itanium】和【JDK on HP-UX 简要介绍及性能调试概要】这两个主题涉及到的是Java在HP-UX操作系统上的运行环境、内存管理和性能优化,特别是针对Itanium架构的Java垃圾收集(GC)机制。以下是详细...
实时显示当前所有线程的状态和相关信息,便于监控程序的并发行为。 **3.3.3 死锁检测图形** 用于检测程序中是否存在死锁现象,这对于避免多线程环境下的潜在问题非常重要。 **3.3.4 当前监控使用视图** 展示当前...
15. `java.class.path`: 定义了Java类加载器寻找类文件的路径,包括类路径的所有JAR文件和目录。 16. `java.library.path`: 包含了Java应用程序可以找到本地库(.dll或.so文件)的路径列表,用于加载动态链接库。 ...
它是Java类加载器在搜索用户自定义类或资源时首先查找的位置之一。 - **配置步骤**: 1. **新建CLASSPATH变量**:在“系统变量”区域,点击“新建”。变量名为`CLASSPATH`,变量值为`%JAVA_HOME%\lib;%JAVA_HOME%\...
- **类跟踪 (Class tracker)**:跟踪类的加载和卸载,对理解类加载机制很有帮助。 ##### 3.2 CPU 视图 - **调用树视图 (Call tree view)**:展示程序执行的调用路径,便于识别耗时较长的方法。 - **热点视图 ...
- **4.1.5 类跟踪 (Class Tracker)**:跟踪类的加载、卸载情况,以及类的数量变化。 **4.2 CPU 视图** - **4.2.1 调用树视图 (Call Tree View)**:展示函数调用的结构,帮助用户理解程序的执行流程。 - **4.2.2 ...
这些环境变量分别定义了 JDK 的安装位置 (`JAVA_HOME`)、类路径 (`CLASSPATH`) 和命令搜索路径 (`PATH`)。 3. **保存并退出** 编辑完成后保存并退出编辑器: ```bash :wq ``` 4. **使更改生效** 为了让...
Java HotSpot(TM) Client VM (build 1.6.0_02, mixed mode) ``` #### 五、查看Linux版本信息 了解Linux系统的版本信息对于排查问题非常有帮助。可以通过以下几种方式查看: 1. **使用`uname -a`命令**:显示内核...
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) ``` #### 四、注意事项 1. **版本兼容性**:虽然本文档以JDK 7为例,但在实际操作中可能需要根据项目的具体需求选择合适的JDK版本。 2. **安全...
方法区( Method area)被所有线程共享,用于存储已被虛拟机加载的类信息、常量、静态 变量、即时编译器编译后的代码等数据。 和Java堆一样,不需要连续的内存,可以选择固定的大小,更可以选择不实现垃圾收集。 运行时...