HotSpot虚拟机
文章平均质量分 91
鸠摩(马智)
马智(花名鸠摩),是《深入解析Java编译器:源码剖析与实例详解》、《深入剖析Java虚拟机:源码剖析与实例详解》基础卷与运行时卷的作者。
展开
-
手写商用Java虚拟机HotSpot,疯狂磨砺技术中
手写商用虚拟机HotSpot,从零开始感受一个大型复杂项目的成型过程。原创 2023-10-18 10:43:45 · 191 阅读 · 1 评论 -
第3篇-CallStub新栈帧的创建
在前一篇 第1篇-关于Java虚拟机HotSpot,开篇说的简单些 中介绍了call_static()、call_virtual()等函数的作用,这些函数会调用JavaCalls::call()函数。我们看Java类中main()方法的调用,调用栈如下:JavaCalls::call_helper() at javaCalls.cpp os::os_exception_wrapper() at os_linux.cpp JavaCalls::call() at javaCalls.cppjni_in原创 2021-11-03 11:18:48 · 342 阅读 · 2 评论 -
第2篇-JVM虚拟机这样来调用Java主类的main()方法
在前一篇 第1篇-关于Java虚拟机HotSpot,开篇说的简单些 中介绍了call_static()、call_virtual()等函数的作用,这些函数会调用JavaCalls::call()函数。我们看Java类中main()方法的调用,调用栈如下:JavaCalls::call_helper() at javaCalls.cpp os::os_exception_wrapper() at os_linux.cpp JavaCalls::call() at javaCalls.cppjni_in原创 2021-11-02 11:36:37 · 363 阅读 · 0 评论 -
第1篇-关于Java虚拟机HotSpot,开篇说的简单点
开讲Java运行时,这一篇讲一些简单的内容。我们写的主类中的main()方法是如何被Java虚拟机调用到的?在Java类中的一些方法会被由C/C++编写的HotSpot虚拟机的C/C++函数调用,不过由于Java方法与C/C++函数的调用约定不同,所以并不能直接调用,需要JavaCalls::call()这个函数辅助调用。(我把由C/C++编写的叫函数,把Java编写的叫方法,后续也会延用这样的叫法)如下图所示。从C/C++函数中调用的一些Java方法主要有:(1)Java主类中的main()方法;原创 2021-11-01 11:43:39 · 268 阅读 · 0 评论 -
Ubuntu16.04上编译OpenJDK8源代码(配视频)
本文将详细介绍在Ubuntu16.04 LTS上对OpenJDK8进行编译,为了方便大家快速搭建起OpenJDK8的调试开发环境,我还录制了对应的视频放到了B站上,大家可以参考。视频地址:https://space.bilibili.com/27533329下面我们开始环境的搭建过程。1、准备编译环境使用的操作系统为Ubuntu16.04,如果读者没有安装Ubuntu,可以在Windows上使用虚拟机的方式进行安装,或者可以直接在电脑上安装多系统,这种方式比以虚拟机安装的方式速度要快。Ubu原创 2020-11-16 14:03:17 · 326 阅读 · 0 评论 -
HotSpot的类模型(4)
我们继续接着上一篇HotSpot的类模型(3)分析,这次主要分析表示java数组的C++类。4、ArrayKlass类ArrayKlass继承自Klass,是所有数组类的抽象基类,类及重要属性的定义如下:class ArrayKlass: public Klass { ... private: int _dimension; // This is n'th-dimensional array. Klass* volatile _hig...原创 2020-08-12 16:55:12 · 278 阅读 · 0 评论 -
HotSpot的类模型(3)
读这篇文章之前,建议阅读如下文章:Ubuntu16.04上编译OpenJDK8源代码调试HotSpot源代码HotSpot项目结构HotSpot的启动过程HotSpot二分模型(1)HotSpot的类模型(2)上一篇HotSpot的类模型(2)介绍了类模型的基础类Klass的重要属性及方法,这一篇介绍一下InstanceKlass及InstanceKlass的子类。2、InstanceKlass类每个InstanceKlass对象表示一个具体的Java类(这里的Jav..原创 2020-07-12 20:38:20 · 375 阅读 · 0 评论 -
HotSpot的类模型(2)
读这篇文章之前,建议阅读如下文章:Ubuntu16.04上编译OpenJDK8源代码调试HotSpot源代码HotSpot项目结构HotSpot的启动过程HotSpot二分模型(1)在前一篇文章HotSpot二分模型(1)中已经讲过,HotSpot采用了OOP-Klass模型描述Java的类和对象。Klass模型采用Klass类及相关子类来表示具体的Java类,可以理解这些类为Java类在C++ 中的对等体。一般 JVM 在加载 Class 文件时,会在方法区创建 Klass ,表.原创 2020-07-09 17:00:55 · 430 阅读 · 0 评论 -
HotSpot二分模型(1)
HotSpot采用了OOP-Klass模型来描述Java类和对象。OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象的具体类型。那么为何要设计这样一个一分为二的对象模型呢?因为类和对象本来就不是一个概念,分别使用不同的对象模型描述符合软件开发的设计思想。另外英文注释也说明了其中的一个原因:One reason for the oop/klass dichotomy in the implementation isthat we don't wan.原创 2020-07-05 15:38:28 · 452 阅读 · 0 评论 -
HotSpot的启动过程
HotSpot通常会通过java.exe或javaw.exe来调用/jdk/src/share/bin/main.c文件中的main()函数来启动虚拟机,使用Eclipse进行调试时,也会调用到这个入口。main.c的main()函数负责创建运行环境,以及启动一个全新的线程去执行JVM的初始化和调用Java程序的main()方法。main()函数最终会阻塞当前线程,同时用另外一个线程去调用JavaMain()函数。main()函数的调用栈如下:main() main.cJLI_Laun.原创 2020-07-04 21:03:35 · 955 阅读 · 1 评论 -
HotSpot项目结构
之前已经介绍了Ubuntu16.04上编译OpenJDK8源代码和调试HotSpot源代码。这一章将介绍HotSpot项目的目录结构。HotSpot目录下主要由agent、make、src和test这4个子目录构成。其中agent目录下包含了Serviceability Agent的客户端实现;make目录下包含了用于编译HotSpot的各种配置文件;src目录是最重要的一个目录,本书讲解的所有源代码都包含在这个目录下;test目录下包含HotSpot相关的一些单元测试用例。src目录的结构如下图所原创 2020-07-03 07:07:55 · 454 阅读 · 0 评论 -
调试HotSpot源代码
之前的文章在Ubuntu 16.04上编译OpenJDK8的源代码已经介绍过在Ubuntu上编译OpenJDK8的源代码,这一篇将介绍在Ubuntu上调试OpenJDK8源代码的2种方式。1、GDB调试源代码在Linux上常用GDB调试C/C++源代码。使用GDB运行如上实例生成的Class文件,具体命令如下:gdb --args ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test进入GDB后,输入如下命令:...原创 2020-07-02 15:10:10 · 1002 阅读 · 0 评论