阅读JVM代码的方法之一就是写一个JNI程序,然后单步跟踪代码。
一、编译出jvm.dll的debug版本。
在我的机器上我用了这个编译命令:build debug compiler1 D:\temp\hotspot C:\Java\jdk1.7.0
二、假设jre安装在:C:\Java\jre1.7.0,那么在C:\Java\jre1.7.0\bin下新建一个目录,目录名称自己定,
例如我就给它叫做:MyJVM。把debug版的jvm.dll复制到:C:\Java\jre1.7.0\bin\MyJVM
这一步是因为在默认情况下,jvm.dll和JRE其他的dll、jar需要这样一个目录层次关系。
这也是正式发布的JRE的jvm.dll位于\bin\client下的原因。
三、在VS中写一个JNI的应用程序,让exe的输出目录为:C:\Java\jre1.7.0\bin\MyJVM
经过这三步后,编译通过,就可以调试jvm.dll了
下面的代码是一个JNI应用程序的例子,先加载JVM,然后就释放JVM。
#include "stdafx.h"
#include <string.h></string.h>
#include <windows.h></windows.h>
#include <jni.h></jni.h>
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")
int _tmain(int argc, _TCHAR* argv[])
{
int res;
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version=JNI_VERSION_1_2;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.";
options[2].optionString = "-verbose:jni";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res < 0)
{
fprintf(stderr, "Can't create Java VM\n");
return 1;
}
jvm->DestroyJavaVM();
fprintf(stdout, "Java VM destory.\n");
return 0;
}
其中代码:
#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")
在VS2005中需要,如果没有上面这行代码,运行会提示:没有找到 MSVCR80.dll
这行代码在VS2003中不需要。
分享到:
相关推荐
`jvm.dll` 文件是Java虚拟机(JVM)的核心组件,它是Java运行时环境(Java Runtime Environment, JRE)的一部分。当你在尝试运行一个Java应用程序时,如果出现“无法加载 `jvm.dll`”的错误,通常意味着系统无法找到...
hsdis.dll是特定于Java的一个动态链接库,全称为HotSpot Service Disassembler,它是Oracle JDK中用于Java字节码反汇编的工具,尤其对于理解和调试Java虚拟机(JVM)的行为非常有帮助。 hsdis.dll的工作原理是将...
在Java开发领域,深入了解字节码的运行机制对于优化程序性能、调试问题以及学习JVM内部工作原理至关重要。hsdis-amd64.dll是这样一个工具,它是HotSpot虚拟机的一个插件,用于将Java字节码反汇编为更易读的x86-64...
在Java项目中,要使用这两个dll文件,你需要将它们放置在系统的PATH环境变量所包含的目录下,或者直接放在Java虚拟机(JVM)可找到的地方,例如与你的Java可执行文件同一目录。如果你使用的是IDE(如Eclipse或...
对于64位系统,你需要64位版本的`rxtxSerial.dll`,因为它与运行在64位JVM上的Java应用程序兼容。这个动态链接库(DLL)是RXTX库在Windows平台上的实现,用于处理串行I/O操作。 使用RXTX库进行Java串口开发,首先...
hsdis-amd64.dll和hsdis-i386.dll是与Java虚拟机(JVM)相关的动态链接库文件,主要用于Java性能分析和调试。这两个文件分别对应于AMD64(也称为x86_64或64位)和i386(32位)架构的处理器。在Java世界中,JVM是运行...
虽然Hadoop主要设计为在Linux集群上运行,但在Windows环境下也可以通过一些优化手段提高性能,例如使用合适的JVM参数、调整HDFS的块大小、开启本地化缓存等。 总之,`hadoop.dll`和`winutils.exe`是Hadoop在...
ICE_JNIRegistry可能是一个特定的实现或者工具,用于处理与JNIRegistry.dll相关的任务,比如调试、优化或者提供额外的功能。由于信息有限,无法详细阐述其具体功能,但在实际开发中,这样的工具可能包括错误检查、...
7. **调试与问题解决** - 如果在使用IKVM.NET过程中遇到问题,可以查看IKVM.NET的官方文档,或者在相关的开发者社区寻找帮助。错误信息通常会包含有关不兼容或未找到的类的详细信息,这对于定位问题非常有帮助。 8...
需要注意的是,这可能会增加JVM的运行开销,因此只应在调试和性能分析时使用。 总的来说,hsdis-amd64.dll插件是Java开发者的一把利器,它提供了深入理解JVM内部工作原理的途径,有助于优化代码性能。通过解析汇编...
标题中的“JVM崩溃”指的是Java虚拟机(Java Virtual Machine)在运行过程中遇到了无法处理的错误,导致程序异常终止的现象。...通过对错误日志的深入解读和调试,通常能找出问题并采取相应的修复措施。
- 提供Hadoop集群的相关信息,如节点状态、JVM内存信息等。 - 支持Hadoop MapReduce作业的提交和监控。 2. **hadoop.dll**: hadoop.dll是Hadoop在Windows下的动态链接库,它包含了Hadoop运行时所需的一些核心...
7. **远程连接(Remote Profiling)**:除了本地应用,JProfiler还支持远程连接到其他服务器上的JVM,方便在分布式环境中进行性能调试。 8. **会话管理(Session Management)**:用户可以保存和加载分析会话,便于...
这个工具允许开发者查看JIT编译后的机器码,对于理解性能问题、优化代码或者调试JVM行为非常有帮助。尤其是在分析JIT编译器如何优化代码时,hsdis-amd64.dll提供了宝贵的洞察力。 使用hsdis-amd64.dll通常涉及到...
在运行Hadoop的Windows环境中,可能会遇到如文件权限问题、端口冲突、JVM兼容性等问题。解决这些问题需要对Windows系统和Hadoop的运行机制有深入理解。同时,由于Windows下的Hadoop生态不如Linux丰富,因此在某些...
《深入理解hsdis-i368....它不仅提供了透明度,使我们能够看到JVM内部的工作细节,还为性能分析和调试提供了宝贵的资料。通过熟练掌握和应用hsdis-i368.dll,开发者可以更有效地优化Java应用程序,提高系统的整体性能。
VisualVM是一款强大的JVM(Java Virtual Machine)监控和性能分析工具,由Oracle公司开发并提供。它集成在Java SDK中,默认位于%JAVA...无论是调试、性能调优还是日常监控,VisualVM都是Java开发者不可或缺的工具之一。
hsdis-amd64.dll是Java虚拟机(JVM)中的一个动态链接库,主要用于Java HotSpot虚拟机的性能分析和调试。这个库文件在64位Windows操作系统上使用,帮助开发者理解Java代码如何被JVM编译为本地机器代码,从而进行更...
标题中的"hsdis-amd64.dll.rar"指的是一个RAR压缩包文件,包含hsdis-amd64.dll这个动态链接库(DLL)文件,专用于查看Java代码的底层汇编指令。DLL文件是Windows操作系统中的一种共享库,它包含可由多个程序同时使用...