JProfile_help.pdf_学习笔记_01

    由于项目遇到了性能问题,用一段时间就出现了outOfMemory异常,以前重来没有处理过类似的问题,很是恼火! 在网上看到javaers们都说JProfile不错,于是就下载下来看看,这一系列文章是记录我修复这个问题的过程。

    第一手的资料当然是官方的文档了,虽然是英文的,不过也没有办法,只能硬着头皮看,混口饭吃不容易啊!

    JVM有很多本地接口, 包含在了 JDK 的安装目录JAVA_HOME/**/include下, 这里面包含了大量的以 .h 结尾的文件,所有的本地库和JVM之间的交流都是定义在 jni.h 这个文件里, Java Native Interface 是 java提供的一种环境,使得 java 代码调用 本地库,以及本地库调用java 代码。

     到JDK 1.5, Sun提供了先后两种用于分析JVM的接口, JVMPI(Profiling Interface) and JVMTI(Tool Interface),后者是前者的改进,解决了 JVMPI不能跑在特殊的虚拟机上的问题和不能分析大堆栈的问题,这两个接口别包含在jvmpi.h 和jvmti.h 里,他们被设计成基于事件的分析模型,可以注册处理不同的事件,当然也可以关闭,这种可配置性对于个性化分析很重要,例如: JProfile 默认对于 对象关联记录时关闭的。当然JProfile提供了GUI的方法监控这个事件.  疑问?文档有说,由于在服务器启动的时候,如果开启了对象关联事件,会加载大量的类,是我们又不关心这些事件,可以设置在某个时间段关闭对象关联事件,也就是说可以在之后的某个时间点,又打开(runtime config),还没有发现怎么设置?

监控事件列表:

 

事件名称 描述
Events for the life-cycle of the JVM 分析代理在JVM完全启动之前就被激活,它可以监控核心类被加载,什么方法被执行对于JVM的初始化阶段
Events for the life-cycle of the classes 分析代理在类 load and unloaded被激活,所有其他的事件,例如对象关联和方法调用事件用整数id被报告给这个事件.(All other events, like the object allocation events or the method call events use the
   integer class ids and the the method ids that are reported with this event.),不知道理解的对不?
Events for the life-cycle of the threads 可以显示不同的线程的调用树,也可以分析监视器冲突,分析代理必须注意什么时候线程创建和销毁,当线程开始,他的标识就被确认了,所有其他的JVMPI/JVMTI 事件有一个指针去标识那个源线程。
Events for the life-cycle of objects 分析代理可以被唤醒,当对象在内存中被垃圾回收器分配,释放,移动。如果对象关联事件被关闭,那么他们被标识为非记录的对象
Events for the life-cycle of method calls (JVMPI only) 用来报告每一个方法的进入和退出, 在JProfile里这叫做“Full instrumentation",但这个不被推荐,因为在JVM里报告每一个方法非常的耗资源,JVMTI 不支持这个,是因为它表现的不是很好对于这个事件。
Events for the life-cycle of monitor contention 无论什么时候你调用 "synchronize" 和Object.wait()时候,JVM会用到Java监视器,进入监视器,推出监视器,等待监视器报告给 分析代理,这些数据可以被JProfile生成以死锁图,监视器冲突视图展现。
Events for garBage Collector 垃圾回收器数据同样被报告给 分析代理

 

今天就到这里吧。。。 Page_11

你可能感兴趣的:(jvm,jdk,jni,sun)