`
touchinsert
  • 浏览: 1329650 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

探索JVM运行状态的利器—JVMPI,HPROF

阅读更多

1.什么是JVMPIJava 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 -<place w:st="on">I.</place> -IC:\j2sdk<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.4.2</chsdate>_10\include -IC

// :\j2sdk<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.4.2</chsdate>_10\include\win32 -Tp.\jvmtrace.c -o jvmtrace.dll

//2.>copy jvmtrace.dll C:\j2sdk<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.4.2</chsdate>_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 -<place w:st="on">I.</place> -IC:\j2sdk<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.4.2</chsdate>_10\include -IC

:\j2sdk<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.4.2</chsdate>_10\include\win32 -Tp.\jvmtrace.c -o jvmtrace.dll

拷贝jvmtrace.dllJAVA_HOME\bin

>copy jvmtrace.dll C:\j2sdk<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.4.2</chsdate>_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.

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

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

例如:

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

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

分享到:
评论

相关推荐

    JVM运行机制深入分析

    JVM运行机制深入分析,适用于研究java开发的人员,想深入理解jvm

    第3节: 揭秘JVM运行时数据区-02

    第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行时数据区-02第3节: 揭秘JVM运行...

    JVM的运行机制

    Java 虚拟机(JVM)是Java编程语言的核心组成部分,它为Java应用程序提供了一个跨平台的运行环境。JVM的设计目标是实现Java代码的“一次编写,到处运行”原则,这得益于它的平台无关性和字节码执行机制。 1. **JVM...

    使用java自带工具监控jvm运行状态

    Java提供了一系列内置工具,方便开发者监控JVM运行状态。以下是对这些工具的详细介绍: 1. **jps(Java Process Status)** `jps`命令是Java的一个实用工具,类似于Linux的`ps`命令,用于查看当前系统中运行的Java...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    10. **JVM诊断工具**:JDK提供了丰富的命令行工具,如jps(Java进程查看)、jstat(统计JVM各种数据)、jmap(内存映射工具)、jhat(堆转储分析)、jconsole(GUI监控工具)等,用于监控和诊断JVM的运行状态。...

    jvm

    JVM(Java Virtual Machine)是运行Java字节码的虚拟机,它为Java程序提供了平台独立性,使得Java程序可以在任何支持JVM的平台上运行而无需重新编译。JVM的主要组成部分包括类加载器、运行时数据区、执行引擎、本地...

    IDEA工具jprofiler插件(JVM分析利器)

    **IDEA工具与JProfiler插件:JVM分析利器** IntelliJ IDEA,作为Java开发者广泛使用的集成开发环境(IDE),提供了丰富的功能和强大的插件支持。其中之一就是JProfiler插件,它是一款针对JVM(Java虚拟机)的高级...

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    这些状态不仅帮助Java程序员理解程序的运行情况,同时也为JVM的设计和优化提供了理论基础。 操作系统线程在JVM中有以下几种状态: 1. ALLOCATED - 内存已被分配,但未初始化。 2. INITIALIZED - 线程已被初始化,...

    SAP JVM 4.1 64 bits

    SAP JVM 4.1 64位是一个专为SAP系统设计的Java虚拟机,它主要用于运行SAP的应用程序和服务。此版本是为64位操作系统优化的,旨在提供更好的性能和内存管理能力,特别是在处理大数据量和复杂计算场景时。 首先,我们...

    java面试视频资源探索JVM底层奥秘ClassLoader源码分析与案例讲解

    java面试视频资源探索JVM底层奥秘ClassLoader源码分析与案例讲解提取方式是百度网盘分享地址

    JVM运行原理以及性能监控

    Java虚拟机运行原理,以及运行状态监控

    一个jvm启动多个springboot服务

    在Java世界中,JVM(Java虚拟机)是运行所有Java应用程序的基础,它为每个应用程序提供了一个独立的运行环境。Spring Boot是一个简化Spring应用开发的框架,它通过提供默认配置和starter项目,使得构建微服务变得...

    JVM运行时数据区

    ### JVM运行时数据区详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,定义了一系列用于程序执行过程中使用的数据区域。这些数据区域在JVM启动时创建,在JVM退出时销毁。其中一些数据区域是线程独立...

    HPROF Agent 英文 版

    HPROF Agent是Java Development Kit (JDK)中附带的一种JVM TI Agent,它用于演示JVM TI的功能,并作为过去版本中基于JVMPI的旧版HPROF的替代品。随着JVM TI的引入,它取代了JVMDI和JVMPI,提供了更先进的性能监控和...

    IDEA设置JVM运行参数的方法步骤

    IDEA设置JVM运行参数的方法步骤 IDEA是JetBrains公司开发的一款功能强大且功能全面的集成开发环境(Integrated Development Environment),其提供了许多实用的功能和设置选项,其中包括设置JVM运行参数的功能。...

    搜索引擎创建索引时JVM 运行时内存溢出解决方案

    综上所述,解决JVM运行时内存溢出问题需要从多个角度进行:合理调整JVM内存参数、优化索引构建算法、监控系统状态并进行必要的硬件升级,甚至考虑采用分布式计算。只有这样,我们才能确保搜索引擎在创建索引时高效、...

    mat工具,可以分析hprof文件

    HProf是Java虚拟机(JVM)生成的一种标准的内存剖析数据格式,它记录了JVM运行时的内存信息,包括对象分配、存活状态、引用关系等。 MAT通过解析hprof文件,能够呈现清晰的内存消耗视图,帮助开发者定位可能导致...

    java 查看JVM中所有的线程的活动状况

    在Java编程环境中,了解JVM(Java虚拟机)中所有线程的活动状态对于调试多线程程序至关重要。本文将详细讲解如何查看JVM中的线程活动情况,并提供相关示例代码。 首先,Java提供了`java.lang.management....

    Java jvm虚拟机.zip

    JVM是一种抽象的计算机,它执行字节码,提供了运行Java程序所需的环境。理解JVM的工作原理对于优化Java应用程序性能至关重要。 首先,我们要知道Java程序的编译过程。Java源代码(.java文件)通过Java编译器(javac...

Global site tag (gtag.js) - Google Analytics