`

探索JVM运行状态的利器—JVMPI,HPROF_剑_百度空间 (引)

    博客分类:
  • java
 
阅读更多

.什么是JVMPI?Java Virtual Machine Profiler Interface。参考 
http://java.sun.com/j2se/1.4.2/docs/guide/jvmpi/jvmpi.html#overview

JVMPI可以做什么?它可以监控VM发生的各种事件。例如当JVM创建,关闭,Java类被加载,创建对象,或GC回收,等37种事件。既然是接口自然就是有一个头文件,[JAVA_HOME]\include\jvmpi.h。您可以开发自己的Profiler监控Java VM的发生的各种事件。

 

下面是我编写的使用JVMPI的例子,输出结果说明了为了运行一个Java类,JVM需要做的各种操作。

 

#include <jvmpi.h>

//1.>cl -LDd -Zi -I. -IC:\j2sdk1.4.2_10\include -IC

//   :\j2sdk1.4.2_10\include\win32 -Tp.\jvmtrace.c -o jvmtrace.dll

//2.>copy jvmtrace.dll C:\j2sdk1.4.2_10\bin\

//3.>java -Xrunjvmtrace org.colimas.jni.test.JniTest

//jvmpi interface 全局指针

static JVMPI_Interface *jvmpi_interface;

//时间通知处理函数

void notifyEvent(JVMPI_Event *event) {

switch(event->event_type) {

       /*非常可怕的输出,好奇就试试。

case JVMPI_EVENT_CLASS_LOAD:

           fprintf(stderr, "trace> Class Load : %s\n", event->u.class_load.class_name);

           break;*/

       case JVMPI_EVENT_ARENA_DELETE :

           fprintf(stderr, "trace> The heap arena :%d is deleted.\n", event->u.delete_arena.arena_id);

           break;    

       case JVMPI_EVENT_ARENA_NEW :

              fprintf(stderr, "trace> The heap arena %s:%d is created.\n",

                     event->u.new_arena.arena_name,

                     event->u.new_arena.arena_id);

           break;    

       case JVMPI_EVENT_GC_FINISH :

              fprintf(stderr, "trace> GC is finished. Used object:%d, space:%d, total object space:%d.\n",

                     event->u.gc_info.used_objects,

                     event->u.gc_info.used_object_space,

                     event->u.gc_info.total_object_space);

           break;

       case JVMPI_EVENT_GC_START :

              fprintf(stderr, "trace>GC is started.\n");

           break;

       case JVMPI_EVENT_HEAP_DUMP :

              fprintf(stderr, "trace> The heap dump begin %s,end %s.\n",

                     event->u.heap_dump.begin,

                     event->u.heap_dump.end);

           break;

       case JVMPI_EVENT_JVM_INIT_DONE :

              fprintf(stderr, "trace> JVM initialization is done.\n");

           break;

       case JVMPI_EVENT_JVM_SHUT_DOWN :

              fprintf(stderr, "trace> JVM is shutting down.\n");

           break;

       case JVMPI_EVENT_THREAD_END :

              fprintf(stderr, "trace> A thread ends.\n");

           break;

       case JVMPI_EVENT_THREAD_START :

              fprintf(stderr, "trace> The thread %s begins whose group is %s, parent is %s.\n",

              event->u.thread_start.thread_name ,

              event->u.thread_start.group_name,

              event->u.thread_start.parent_name);

           break;

}                      

}

// profiler agent entry point

extern "C" {

JNIEXPORT jint JNICALL JVM_OnLoad(JavaVM *jvm, char *options, void *reserved) {

    fprintf(stderr, "trace> initializing ..... \n");

 

    // get jvmpi interface pointer

    if ((jvm->GetEnv((void **)&jvmpi_interface, JVMPI_VERSION_1)) < 0) {

      fprintf(stderr, "trace> error in obtaining jvmpi interface pointer\n");

      return JNI_ERR;

    }

    // initialize jvmpi interface

    jvmpi_interface->NotifyEvent = notifyEvent;

    // enabling class load event notification

    //jvmpi_interface->EnableEvent(JVMPI_EVENT_CLASS_LOAD, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_ARENA_DELETE, NULL);

       jvmpi_interface->EnableEvent(JVMPI_EVENT_ARENA_NEW, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_GC_FINISH, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_GC_START, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_HEAP_DUMP, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_JVM_INIT_DONE, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_JVM_SHUT_DOWN, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_THREAD_END, NULL);

    jvmpi_interface->EnableEvent(JVMPI_EVENT_THREAD_START, NULL);

    fprintf(stderr, "trace> .... ok, dumping...\n");

    if (jvmpi_interface->RequestEvent(JVMPI_EVENT_HEAP_DUMP,NULL)<0)

    {

      fprintf(stderr, "trace> error in obtaining jvmpi interface pointer\n");

      return JNI_ERR;

    }

    fprintf(stderr, "trace> .... end\n\n");

    return JNI_OK;

}

}

编译

>cl -LDd -Zi -I. -IC:\j2sdk1.4.2_10\include -IC

   :\j2sdk1.4.2_10\include\win32 -Tp.\jvmtrace.c -o jvmtrace.dll

拷贝jvmtrace.dll到JAVA_HOME\bin

>copy jvmtrace.dll C:\j2sdk1.4.2_10\bin\

运行

>java -Xrunjvmtrace org.colimas.jni.test.JniTest

结果

trace> initializing .....

trace> .... ok, dumping...

trace> .... end

trace> The thread Finalizer begins whose group is system, parent is (null).

trace> The thread Reference Handler begins whose group is system, parent is (nul

l).

trace> The thread main begins whose group is main, parent is system.

trace> JVM initialization is done.

trace> The thread Signal Dispatcher begins whose group is system, parent is (nul

l).

hello JVM

trace> A thread ends.

trace> The thread DestroyJavaVM begins whose group is main, parent is system.

trace> A thread ends.

trace> JVM is shutting down.

2.HPROF又什么是?HPROF是J2SE自带的一个简单的profiler agent。 他是一个动态链接库文件,监控CPU的使用率,Heap分配情况等。将这些信息输出到文件或到socket。

java –Xrunhprof ToBeProfiledClass [:help]|[:=, ...]

例如:

>java -Xrunhprof:heap=all org.colimas.jni.test.JniTest

在当前目录会生成java.hprof.txt文件。文件内记载了JVM运行时Heap的运行情况。

分享到:
评论

相关推荐

    JVM的相关概念___已看.doc

    JVM的相关概念___已看.doc

    04、导致JVM内存泄露的ThreadLocal详解-ev

    04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、...

    JVM、GC详解及调优_jvm_JVM、GC详解及调优_

    《JVM、GC详解及调优》是一份深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的详细资料。本文将根据提供的信息,深入阐述JVM的工作原理,GC的机制以及如何进行JVM的性能调优。 首先,JVM是...

    jvm_jvm新手_jvm_

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。作为新手,了解JVM的工作原理和优化技巧是成为熟练Java开发者的重要步骤。以下是一些关于JVM的关键知识点: 1. **内存区域...

    Java_Jvm_Jsp_Spring3_Struts2_Hibernate_Oracle _

    Java_Jvm_Jsp_Spring3_Struts2_Hibernate_Oracle _

    CCallJava.rar_c++ jvm_java dll_jvm_jvm.dll_vc jvm.dll

    VC调用java的简单例子。需要注意jvm.dll路径,路径不对就不能成功!

    JVM.zip_java jvm_jvm

    总的来说,"JVM.zip"提供的资源对于任何Java开发者来说都是有价值的,它帮助我们更好地理解和管理Java应用程序在JVM上的运行状态,从而实现更高效、更稳定的系统性能。通过深入学习和利用这些工具,开发者能够提升...

    模仿_jvm_跨平台部署。_使用_shell_脚本一键安装保证_maclinux_开发环境和线上环_cdk.zip

    模仿_jvm_跨平台部署。_使用_shell_脚本一键安装保证_maclinux_开发环境和线上环_cdk

    jvm.zip_jvm_knownobc_tomcat

    综上所述,"jvm.zip_jvm_knownobc_tomcat"这个压缩包中的内容将帮助我们深入理解如何调整Tomcat的JVM设置,以实现更高效、更稳定的运行环境。通过对这些知识点的掌握,可以提升Tomcat在处理复杂应用时的性能,降低...

    jvm.rar_JAVA虚拟机_jvm

    JAVA虚拟机(JVM)是Java程序运行的核心组件,它是一种抽象计算机,负责解释和执行Java字节码,使得Java程序具有跨平台的能力。在深入理解JVM之前,我们需要了解几个基本概念: 1. **字节码**:Java源代码经过编译...

    java11-jvm白皮书_java_govwe_

    JVM(Java虚拟机)是Java平台的核心组件,负责运行Java程序。在Java 11中,对JVM进行了一些关键的优化和更新,这些变化对于理解和提升Java应用程序的效率至关重要。 首先,让我们深入了解Java 11中的JVM改进。JVM...

    JVM.zip_JVM代理_classloader

    在Java世界中,JVM(Java虚拟机)是运行所有Java程序的核心,它负责加载、验证、执行字节码,并管理内存。而JVM代理(JVM Agent)和类加载器(ClassLoader)则是两个关键的概念,它们对于深入理解Java应用程序的运行...

    java jvm及性能优化_javajvm优化_Java性能分析_

    Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,提供了一个平台无关的运行环境。JVM性能优化是提升Java应用效率的关键环节,涉及到内存管理、垃圾回收、线程调度等多个方面。以下是对"Java JVM及...

    JVM_多线程高并发_集合框架_数据库 BAT面试金典常见80问.pdf

    《JVM_多线程高并发_集合框架_数据库 BAT面试金典常见80问.pdf》这份资料聚焦于Java开发人员在面试中可能遇到的重要问题,涵盖了JVM、多线程高并发、集合框架和数据库等多个核心领域。以下是对这些知识点的详细说明...

    面试必问之jvm与性能优化_java_

    Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行字节码,为开发者提供了跨平台的运行环境。在面试中,对于Java开发者来说,深入理解JVM及其性能优化是至关重要的。以下是对JVM核心知识及性能优化的一些...

    JVM.rar_java 工作流_java 虚拟机_jvm_jvm hook_虚拟机 Java

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。在深入理解JVM的工作流程之前,我们首先需要知道Java程序是如何被编译和运行的。Java源代码(.java文件)通过Java编译器...

    inside_jvm.rar_Inside the JVM_gettingloaded.html_inside jvm_insi

    《深入理解JVM》(Inside the JVM) 是一本关于Java虚拟机的重要参考资料,它涵盖了JVM的内部工作原理,包括类加载机制、内存管理、字节码执行等核心概念。"gettingloaded.html" 可能是其中的一个章节,专门探讨了类的...

    java-error-in-idea64主要是javaJVM的dump导出学习使用

    这个错误表明程序在运行过程中耗尽了可用内存,导致JVM无法正常工作。在这种情况下,程序员会生成一个heap dump文件,如`java_error_in_idea64.hprof`,以便后续分析和解决问题。 首先,`java_error_in_idea64....

    java_jvm_参数_-Xms_-Xmx_-Xmn_-Xss_调优总结.pdf

    - **影响**:年轻代是JVM堆空间的一部分,主要用于存放新创建的对象。合理设置年轻代的大小有助于提高GC的效率,减少Full GC的次数。Sun官方推荐配置为整个堆的3/8。 - **示例**:`-Xmn2g` 表示设置年轻代大小为2GB...

    Java性能监控与调优Demo,主要学习各种JDK监控工具以及jvm调优-monitor_tuning_Demo.zip

    通过这些工具和参数的使用,我们可以有效地监控Java应用的运行状态,发现性能瓶颈,并进行针对性的优化。在学习这个Demo时,你可能会接触到如何使用这些工具进行实战操作,理解它们的工作原理,以及如何根据实际情况...

Global site tag (gtag.js) - Google Analytics