java 虚拟机源码分析

Posted fufujia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 虚拟机源码分析相关的知识,希望对你有一定的参考价值。


 

?openjdk下载:

地址: http://hg.openjdk.java.net 下载openjdk7

 

Hotspot下的模块:

Adlc: 平台描述文件

Libadt: 抽象数据结构

Asm: 汇编器

Code: 机器码生生成

C1: client编译器, 即C1编译器

Ci: 动态编译器

Compiler: 调用动态编译器的接口

Opto: Server编译器,即C2编译器

Shark: 基于LLVM实现的即时编译器

Interpreter: 解释器

Classfile: Class文件解析和类的链接等

Gc_interface: GC接口

Gc_implementation: 垃圾收集器的具体实现

Memory: 内存管理

Oops: JVM内部对象表示

Prims: HotSpot对外接口

Runtime: 运行时

Services: JMX接口

Utilizes: 内部工具类和公共函数

 

搭建编译环境:

操作系统: Ubuntu 12.10

编译环境: GCC4.7 , G++4.6 和 GDB7.5 , jdk1.6 要使用Oracle的 jdk1.6

 

编译脚本:

#!/bin/bash
export LANG=C
#导入JDK路径
#这是我的jdk1.6路径
export ALT_BOOTDIR="/home/laoyuan/work/soft/jdk1.6"
export ALT_JDK_IMPORT_PATH="/home/laoyuan/work/soft/jdk1.6"
?
#导入ANT路径
export ANT_HOME="/home/laoyuan/work/soft/apache-ant-1.8.4"
?
#导入PATH
export PATH=$PATH:$ANT_HOME
#其他配置:
export HOTSPOT_BUILD_JOBS=5
?
#输出目录
export ALT_OUTPUTDIR="/root/hotspot/build/hotspot_debug"

 

选择目标版本为jvmg , 启动编译HotSpot命令:

>cd make
>make jvmg jvmg1 2>&1 | tee /root/hotspot/build/hotspot_debug.log
如果一切顺利在 /root/hotspot/build/hotspot_debug 目录下会看到:

linux_i486_compiler1和linux_i486_compiler2

>cd linux_i486_compiler1
>ls
debug fastdebug generated jvmg optimized product profiled
shared_dirs.lst
到这里就编译成功了。

 

我们在调试编译好的openjdk时需要使用gdb打断点

GDB 命令如下:

回车键:重复上一命令

(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h

(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r

(gdb)start:单步执行,运行程序,停在第一执行语句

(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l

(gdb)set:设置变量的值

(gdb)next:单步调试(逐过程,函数直接执行),简写n

(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s

(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt

(gdb)frame:切换函数的栈帧,简写f

(gdb)info:查看函数内部局部变量的数值,简写i

(gdb)finish:结束当前函数,返回到函数调用点

(gdb)continue:继续运行,简写c

(gdb)print:打印值及地址,简写p

(gdb)quit:退出gdb,简写q

(gdb)break+num:在第num行设置断点,简写b

(gdb)info breakpoints:查看当前设置的所有断点

(gdb)delete breakpoints num:删除第num个断点,简写d

(gdb)display:追踪查看具体变量值

(gdb)undisplay:取消追踪观察变量

(gdb)watch:被设置观察点的变量发生修改时,打印显示

(gdb)i watch:显示观察点

(gdb)enable breakpoints:启用断点

(gdb)disable breakpoints:禁用断点

(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元

(gdb)run argv[1] argv[2]:调试时命令行传参

(gdb)set follow-fork-mode child#Makefile项目管理:选择跟踪父子进程(fork())

   core文件:先用$ ulimit -c 1024 开启core,当程序出错会自动生成core文件。调试时 gdb a.out core

参考资料:

《HotSpot实战》陈涛 人民邮电出版社

                                                                                                                                                                                                        《END》

                                                                                                                                                 作者:老猿

 技术图片

 

                                                                                                                                                                                                                                                                               微信扫描二维码,关注我的公众号?
————————————————
版权声明:本文为CSDN博主「p312011150」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/p312011150/article/details/104137542

以上是关于java 虚拟机源码分析的主要内容,如果未能解决你的问题,请参考以下文章

java 虚拟机源码分析

Android 源码分析 Dalvik 虚拟机创建过程

Java多线程中断机制三种方法源码分析

Java 虚拟机原理Class 字节码二进制文件分析 七 ( 局部变量表分析 )

深入理解 python 虚拟机:描述器实现原理与源码分析

深入理解python虚拟机:调试器实现原理与源码分析