自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 手写商用Java虚拟机HotSpot,疯狂磨砺技术中

手写商用虚拟机HotSpot,从零开始感受一个大型复杂项目的成型过程。

2023-10-18 10:43:45 136 1

原创 C++ 重载运算符在HotSpot VM中的应用

C++支持运算符重载,对于Java开发者来说,这个可能比较陌生一些,因为Java不支持运算符重载。运算符重载本质上来说就是函数重载。下面介绍一下HotSpot VM中的运算符重载。

2023-10-10 10:34:02 75 1

原创 C++ RAII在HotSpot VM中的重要应用

在HotSpot VM中,RAII对内存资源的管理和释放、明确定义范围锁及记录重要信息等方面起到了非常重要的作用。

2023-09-21 18:57:40 189

原创 第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 287

原创 第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 343

原创 第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 248

原创 Java虚拟机漫漫学习路,我终于悟了

毕业8年,前5年的职业规划是做计算广告,后来感觉计算广告这一行更注重的是业务而非技术,而自己的性格更适合做技术,所以毅然决然的辞职, 全职1年半时间写了2本关于Java编译器与虚拟机的书,今年年初来到杭州做Java虚拟机开发相关的工作,也算是顺利切入Java虚拟机这一行了。差不多从下决心研究Java虚拟机开始已经过去了3年多的时间,期间还研究了Java前端编译器,这一块也花费了我好多精力,着实有些不值,因为Java前端编译器相对虚拟机来说并不显的那么重要,而且目前也没有公司有Java前端编译器的开发需求

2021-08-23 11:51:36 389

原创 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 309

原创 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 249

原创 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 362

原创 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 399

原创 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 431

原创 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 905 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 407

原创 调试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 967

原创 第3篇-如何编写一个面试时能拿的出手的开源项目?

前2篇的链接如下:第1篇-如何编写一个面试时能拿的出手的开源项目?第2篇-如何编写一个面试时能拿的出手的开源项目?第1篇介博文中详细介绍过编写一个规范开源项目所要遵循的规范,并且初步实现了博主自己的开源项目Javac AST View插件,不过只搭建了项目开发的基本框架,树状结构的数据模型也是硬编码的;第2篇从Eclipse编辑器中读取Java源代码并转换为Javac的抽象语法树,然...

2020-02-29 08:21:39 448

原创 第2篇-如何编写一个面试时能拿的出手的开源项目?

在第1篇-如何编写一个面试时能拿的出手的开源项目?博文中曾详细介绍过编写一个规范开源项目所要遵循的规范,并且初步实现了博主自己的开源项目Javac AST View插件,不过只搭建了项目开发的基本框架,树状结构的数据模型也是硬编码的,本篇博文将继续完善这个项目,实现动态从Eclipse编辑器中读取Java源代码,并在JavacASTViewer视图中展现Javac编译器的抽象语法树。实现过程...

2020-02-27 08:28:46 607

原创 第1篇-如何编写一个面试时能拿的出手的开源项目?

编写一个不错的开源项目至少有3个好处:(1)练技术,长经验(2)面试时展现自己的Coding能力(3)获取成就感练技术,长经验是最实在的,不过如果自己有一个好的开源项目,还可以在开源中国或github上开源,让更多人受益,也许能获得许多的Star,让自已获得满足,激励自己完善项目功能。在面试时,也可以在简历显眼的位置给出开源项目名称和Git地址。面试官一般都会去查看,这是程序员实力...

2020-02-12 19:08:16 2832 1

原创 如何研究Javac与HotSpot

现在使用Java语言的人很多,但是了解Java语言实现的人非常少。如果要研究Java语言的实现,推荐研究Javac和虚拟机HotSpot的源代码实现,其中Javac相当于Java编译的前端,HotSpot是Java语言运行的基础。弄懂了Javac与HotSpot,对Java语言也就达到了“精通”的地步了。下面我结合自己的研究过程总结一下,如果要研究Javac与HotSpot,目前可参考的一些资...

2019-11-28 19:50:18 750 1

原创 我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了

一个十足的技术迷,2013年毕业,做过ERP、游戏、计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书《深入解析Java编译器:源码剖析与实例详解》,在近期就会上市销售了。1、为什么要写这本书?从去年年底离职到今天7月交完《深入解析Java编译器:源码剖析与实例详解》书稿,到现在上市发行也差不多一年过去了,也算是给了自己这一年一个交待吧。写书不...

2019-11-28 15:12:06 2574 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除