JProfile_help.pdf_学习笔记_02

    有一些信息,像对象之间的引用和对象里的数据是不可用的对于 JVMP/JVMTI 所定义的事件,要得到堆内存所有对象的详尽的信息,分析代理可以被“Heap Dump”激活。可以对 堆内存做一个快照。 在 JVMP/JVMTI  执行的时候是不同的: JVMPI 打包堆中所有的对象和他们之间的引用到一个字节数组,并传输到 分析代理,然后这个字节数组会被解析,展现。当然:为了做这个操作很消耗内存,首先,堆本质上是被复制到字节数组,然后分析代理必须解析它并且转换他为数据结构。 为了减少内存峰值,JProfiler 保存字节数组到磁盘上的一个临时文件,释放数组,然后解析临时文件的内容。当分析一个应用程序的可用物理内存达到极限时,用“Heap Dump”会让JVM宕机,简单的原因就是没有足够的物理内存来分配大量需要的内存区。在JVMTI 1.5后,这种情况就已经改进了,JProfiler 可以列举出所有在堆中存在的引用并且构造他们为自己的数据结构。

    好了说了这么多,让我们看看分析代理如何被激活,不象 JNI 库,你需要加载和激活从Java代码,分析代理必须被激活在JVM启动的阶段,通过特殊的JVM参数

      Java <=1.4.2(JVMPI)   -Xrunjprofiler

      Java >=1.5.0(JVMTI)   -agentlib:jprofilerti

"-Xrun"  或 "-agentlib:" 他们告诉JVM, JVMPI/JVMTI 分析代理被加载,剩下的字符串依赖于本地库,

windows     jprofiler.dll

Linux/unix  libjprofiler.so

Max os X    libjprofiler.dylib

参数可以传递给分析代理通过加 (冒号-JVMPI),(等号-JVMTI),例如:

-Xrunjprofiler:port=10000 或 -agentlib:jprofilerti=port=10000,

参数 port=10000 将被传递给分析代理。

    如果JVM不能加载指定的本地库,将退出,并报告错误消息。如果成功,则调用本地库中的功能去给分析代理机会去初始化它本身。

     分析代理和分析界面-----不象基本分析器,收集数据然后写数据文件到磁盘,高级分析器可以在运行时显示分析的数据,尽管它可以直接启动UI从分析代理,这样做是个坏主意,因为分析的进程将被中断(二级程序),远程分析不能实现,因此JProfiler GUI 被启动在一个单独的JVM里,他们之间的通讯是通过socket实现的,这也是因为如果你在JProfiler里启动应用程序,是被配置为"local" sessions.

      为了分析成功,选择正确的分析参数是很重要的,特殊的过滤器是被记录调用树 的限定条件,因为这些参数在启动时需要,分析代理停止JVM,等待一个连接从GUI,一些参数在这里配置,一旦连接建立,被分析的程序就可以启动了,记录的分析数据驻留在分析代理内部的数据结构里,事实上只有很少的一部分被传输到了GUI,例如,在hotspots views里打开调用树,可以看到只有很少的数据被传递到GUI,这个也是因为考虑到性能的问题,

          

你可能感兴趣的:(jvm,数据结构,linux,socket,jni)