`
李静波
  • 浏览: 53948 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论
文章列表
用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 ...
目前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 ...
这是个棘手的话题,到目前为止,我也没有看得太明白。先记录下我现在的一些理解。   先看几个主要的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关联起来。   下 ...

JVM的Log

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 ...
又一个在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.]*\).* ...
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 ...
SystemDictionary正如它所暗示的那样,它是用来保存系统信息的一个字典,其实现基于Hash表。 它保存了系统已经加载了class信息。 下面是SystemDictionary保存class信息的变量。   static Dictionary*        _dictionary;     static PlaceholderTable*  _placeholders;   其中 _dictionary是存放已经加载的class的Hash表。      _placeholders是存放正在加载的class的Hash表。   同时对于最常用的系统class,SystemDictiona ...
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 ...
JVM.dll作为了一个引擎性质的dll,外部与其交互的接口除了各个function, 可配置的参数也是很重要的一个途径。   JNI编程中,通过JavaVMOption向JVM传递参数。   HotSpot代码中对于参数的处理主要分为两部分。 一个是由命令行参数解析出各个用户配置的值,并把这个写用户的值存储在内部变量中。 另外一部分就是分散在VM各个地方的对这些内部变量的使用。   对应的代码没有应用高深的技巧,主要是字符串的解析处理,代码主要集中在Arguments.hpp、Arguments.cpp中。   参数传入JVM有三种形式 一:-Dxxx 例如:-Djava.class.pat ...

解释器

解释器的初始化 JNI_CreateJavaVM | |-->  Threads::create_vm    |    |--> init_globals       |       |-->interpreter_init          |          |-->AbstractInterpreter::initialize            |            |-->TemplateTable::initialize   通常提到解释器的时候,对其实现都是这样一个印象: 一个解释器就是不断地读取当前的指令,然后是一个大的switch语句。 ...
除了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   < ...
今天来看一个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 ...
代码位于\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); 这里面突然 ...
给开发者发了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的开发人员 ...
今天beta3的代码发布了。 我用VS2005编译了它的代码,除了一个无关痛痒的unicode编码错误之外, 其他的编译错误都被解决了。   现在剩下的问题是: D:\temp\hotspot\src\share\vm\runtime\vm_version.cpp Line 233   这个问题我已经用mail list向开发组报告了,不久的将来就会被fix。 我临时的处理办法见这里。
Global site tag (gtag.js) - Google Analytics