- 浏览: 53948 次
- 性别:
- 来自: 大连
最新评论
-
funnyone:
...
class的实例在JVM中的内部表示 -
dengyigang:
http://dengyigang.iteye.com/blo ...
调试jvm.dll -
jianrc:
我试过编译,但编译出来的只有jvm.lib和jvm.dll等文 ...
Core Compiler1 Compiler2 -
李静波:
rayen_zhang:
请参见 http://leeji ...
调试jvm.dll -
rayen_zhang:
请问,选项 core compiler1 compiler2的 ...
调试jvm.dll
文章列表
用VS2008编译JVM
目前JVM的编译脚本还不支持VS2008,所以本方法属于玩票。
先做如下修改
1、\hotspot\make\windows\makefiles\compile.make
Line 53 改为
CPP_FLAGS=/nologo /W3 /WX /D "_CRT_SECURE_NO_DEPRECATE=1" /D "_CRT_NONSTDC_NO_DEPRECATE=1"
原因:这个错误在当初JVM还不支持VS2005的时候就可以这么修改。参见:http://leejingbo.iteye.com/b ...
- 2008-09-02 14:10
- 浏览 1874
- 评论(0)
目前OpenJDK公开的文档中只是对Compiler1和Compiler2做了解释,对Core并没有太多的解释。
先看官方的解释
C1 compiler
Fast, lightly optimizing bytecode compiler.
Performs some value numbering, inlining, and class analysis.
Uses a simple CFG-oriented SSA "high" IR, a machine-oriented "low" IR,
a linear scan register a ...
- 2006-12-25 10:44
- 浏览 2645
- 评论(1)
这是个棘手的话题,到目前为止,我也没有看得太明白。先记录下我现在的一些理解。
先看几个主要的class
Thread、VMThread、JavaThread、OSThread
VMThread和JavaThread都是Thread的子类,而OSThread的父类是CHeapObj。所以,OSThread是一个Helper。
VMThread是JVM内部用的Thread,例如GC Thread。
JavaThread则是对应java.lang.Thread
通过Thread::set_osthread(OSThread *thread)把OSThread和Thread关联起来。
下 ...
- 2006-12-20 15:45
- 浏览 5624
- 评论(0)
JVM在调试版本下,会输出hotspot.log。通过参数-Xloggc:FileName,来设置GC的log。
Log的实现主要在
\hotspot\src\share\vm\utilities\ostream.hpp
\hotspot\src\share\vm\utilities\ostream.cpp
\hotspot\src\share\vm\utilities\xmlstream.hpp
\hotspot\src\share\vm\utilities\xmlstream.cpp
\hotspot\src\share\vm\utilities\defaultStr ...
- 2006-12-20 14:33
- 浏览 2215
- 评论(0)
又一个在VS2005下编译错误的解决办法
周末重装了OS,连带VS2005也重新安装了。
这次又遇到了编译JVM的错误,很是纳闷,突然想起来这次我用的VS2005和我原来用的不一样。
这次我的Version是真正的中文版,cl.exe编译器输出的信息完全是中文的。
解决办法:
把 \hotspot\build\windows\get_msc_ver.sh
Line 57:
MSC_VER_RAW=`cl 2>&1 | "$HEAD" -n 1 | "$SED" 's/.*Version[\ ]*\([0-9][0-9.]*\).* ...
- 2006-12-18 10:54
- 浏览 1537
- 评论(0)
vmSymbols和vmSymbolHandles这两个都是只拥有静态成员和方法的class。
其定义在:\hotspot\src\share\vm\memory\vmSymbols.hpp
用来缓存JVM内部常用的symboleOop和symboleHandle。
例如:
symbolOop obj = vmSymbols::java_lang_Object(); // java.lang.Object的oop
SymbolHandle handle = vmSymbolHandles::java_lang_Object(); // oop对应的Handle
vmS ...
- 2006-12-15 14:37
- 浏览 1676
- 评论(0)
SystemDictionary正如它所暗示的那样,它是用来保存系统信息的一个字典,其实现基于Hash表。
它保存了系统已经加载了class信息。
下面是SystemDictionary保存class信息的变量。
static Dictionary* _dictionary;
static PlaceholderTable* _placeholders;
其中 _dictionary是存放已经加载的class的Hash表。
_placeholders是存放正在加载的class的Hash表。
同时对于最常用的系统class,SystemDictiona ...
- 2006-12-14 13:57
- 浏览 1863
- 评论(0)
initialize_class函数位于:\hotspot\src\share\vm\runtime\Thread.cpp
作用:完成一个java class从磁盘文件加载到JVM内部数据结构(oop)这一个过程。
先看它的定义
static void initialize_class(symbolHandle class_name, TRAPS)
第一个参数class_name,是一个Handle,对对应要加载的class。
第二个参数是TRAPS,是当前的Thread和异常处理代码,参见这里。
那么class loader在哪里?initialize_class用的是VM自身的cla ...
- 2006-12-13 15:06
- 浏览 1833
- 评论(0)
JVM.dll作为了一个引擎性质的dll,外部与其交互的接口除了各个function,
可配置的参数也是很重要的一个途径。
JNI编程中,通过JavaVMOption向JVM传递参数。
HotSpot代码中对于参数的处理主要分为两部分。
一个是由命令行参数解析出各个用户配置的值,并把这个写用户的值存储在内部变量中。
另外一部分就是分散在VM各个地方的对这些内部变量的使用。
对应的代码没有应用高深的技巧,主要是字符串的解析处理,代码主要集中在Arguments.hpp、Arguments.cpp中。
参数传入JVM有三种形式
一:-Dxxx 例如:-Djava.class.pat ...
- 2006-12-12 14:31
- 浏览 1901
- 评论(1)
解释器的初始化
JNI_CreateJavaVM
|
|--> Threads::create_vm
|
|--> init_globals
|
|-->interpreter_init
|
|-->AbstractInterpreter::initialize
|
|-->TemplateTable::initialize
通常提到解释器的时候,对其实现都是这样一个印象:
一个解释器就是不断地读取当前的指令,然后是一个大的switch语句。
...
- 2006-12-11 14:28
- 浏览 1954
- 评论(0)
除了oop和Klass之外还有一个重要的数据结构Handle
oop和Klass的定义都在\hotspot\src\share\vm\oops目录下,
而Handle的定义则在\hotspot\src\share\vm\runtime目录下。
Handles.hpp、Handles.inline.hpp、Handles.cpp是定义Handle的源文件。
从其所在的目录runtime就可以推知Handle更多的是和运行时相关了。
因为有不同的oop,也就有对应的Handle。
例如
oop <===> Handle
methodOop < ...
- 2006-12-08 09:26
- 浏览 1995
- 评论(0)
今天来看一个class的实例在JVM中的内部表示。
先看下面的简图。
http://leejingbo.iteye.com/upload/picture/pic/1344/23ed1678-2fa5-4fa6-bdf9-fe15320f4a24.jpg
这是对应的代码。
class instanceKlass: public Klass {
// ...
protected:
objArrayOop _methods;
objArrayOop _local_interfaces;
typeArrayOop _fields;
c ...
- 2006-12-07 15:31
- 浏览 2293
- 评论(1)
代码位于\hotspot\src\share\vm\runtime\Thread.cpp Line 2891~Line 3226
这个方法是JVM初始化的主要方法,300多行代码,代码虽然很多,但是思路很清晰,比较容易阅读。
JVM初始化无外乎:解析参数、分配内存、创建内部数据结构、创建主线程、加载系统class等步骤。
这些代码均是相当好地被放在各个函数中,代码写的相对直白。
下面讲讲初次看这个方法,比较难理解的一个地方
Thread.cpp Line 3138
SystemDictionary::compute_java_system_loader(THREAD);
这里面突然 ...
- 2006-12-04 13:40
- 浏览 2658
- 评论(0)
给开发者发了mail,很快就得到了回复。
\hotspot\src\share\vm\runtime\vm_version.cpp
Line 233的编译错误的原因是:
环境变量USERNAME为中文引起。
所以目前的解决办法就是
在运行编译脚本前,把USERNAME设置为ASCII字符串。
例如,我就这样做:set USERNAME=LeeJingbo
我原来以为这个错误是VS2005的缘故,其实在VS2003下也会有这个毛病,只是碰巧的是我装VS2003的电脑上的USERNAME是ASCII字符串,而装VS2005的电脑上的USERNAME是中文。
这个问题被sun的开发人员 ...
- 2006-12-04 09:14
- 浏览 1484
- 评论(0)
今天beta3的代码发布了。
我用VS2005编译了它的代码,除了一个无关痛痒的unicode编码错误之外,
其他的编译错误都被解决了。
现在剩下的问题是:
D:\temp\hotspot\src\share\vm\runtime\vm_version.cpp
Line 233
这个问题我已经用mail list向开发组报告了,不久的将来就会被fix。
我临时的处理办法见这里。
- 2006-12-01 10:40
- 浏览 1543
- 评论(0)