手写商用Java虚拟机HotSpot,疯狂磨砺技术中
在当前Java行业激烈竞争的形式下,唯有掌握技术,心中才不能慌。在多年前,我就开始苦练底层技术,但是眼看百遍也不如手过一遍,所以我打算把虚拟机的精华实现部分用手敲出来,这个过程注定不会轻松,但是心态不能着急,要一步一步来,一年二年三年后终能达成。
这个过程还会录制一些免费视频,简单介绍一下这个视频适合的目标人群,达到的目的等。
1、目标人群
对虚拟机底层实现有浓厚兴趣的人
想提升Java技术,精通Java语言的人
想切入虚拟机和编译器领域研发的人
想通过大型复杂的项目提升C++水平的人
不过HotSpot VM项目太过复杂,对C++、Linux系统编程、汇编指令、机器指令、编译原理等各方面都有较高的要求,如果这些方面的基础比较弱的话,还需要多加强。
2、达到的目的
精通Java的底层实现
对虚拟机的性能调优和故障排查得心应手
能够对虚拟机整体的实现有一个清晰的认识,达到动手开发虚拟机的能力
对后续研究更为复杂的C2编译器和G1等垃圾收集器有非常大的帮助
熟练使用C++
熟练掌握汇编语言
当研究lua、python等虚拟机时会感到更简单,研究v8等时感觉代码许多都很熟悉,很类似
另外,开课也会让许多人坚持下来,毕竟有人引路,也能节省非常多的时间和精力
3、编译调试环境
Linux(Ubuntu 16.04)
CPU架构为X86,位数为64
版本仅支持JDK1.8(也就是向前兼容的代码全部省略)
Linux内核版本 4.4.0-210-generic
GNU 5.4.0版本的编译器
编辑器:Visual Studio Code1 .51.0
使用语言:主体为C++语言,少量汇编有C语言
4、功能说明
商用HotSpot VM手写内容时,由于整个工程的代码在50万行左右,其中95%以上都是C++。我们只实现其实的精华部分即可,所以许多功能都不会实现。
不实现的功能如下:
(1)只实现C1编译器,不实现C2编译器
(2)没有指针压缩版实现
(3)堆不支持大页
(4)字节码解释器不再手写实现(PC上的效率太低,不适合生产用,但是会详细介绍)
(5)只包含Serial/Serial Old收集器,后期会实现G1,不实现Parallel和CMS等收集器
(6)不对类加载过程中的类进行合法性验证,也就是没有验证阶段
(7)不实现偏向锁和轻量级锁,直接使用重量级锁,会详细介绍偏向锁和轻量级锁
(8)线程采用NPTL 2.23版本,不兼容LinuxThreads
(9)不对一些统计做实现,如写PerfData, NMT等功能,记录GC日志等
(10)不实现SharedCDS
(11)省略SecurityManager和Protected Domain,类型安全检查约束
(12)不实现调试信息记录
(13)FlatProfiler不实现
(14)不实现一些实验性质的逻辑
(15)可省略的一些验证逻辑,如验证AdapterBlob的正确性,加上-XX:-VerifyAdapterCalls命令省略
(16)不对一些支持Java层Deprecated方法的功能进行实现,如线程的suspend和resume
(17)对默认选项为false的逻辑不实现,如UseNUMA等
(18)JNI和JVMTI选择性实现
(19)不实现vmStructs,不支持 SA(Serviceability Agent)
(20)不实现JMX、Attach及内部一些命令,如dumpheap、threaddump、jcmd及load等
当然,后续还有非常多需要补充和完善的地方,请持续关注...
5、实现路径:
大模块的实现路径如下:
内部锁
线程
二分模型
类的加载和解析
堆的简单规划
元数据区
CodeCache
模板解释器解释执行
Serial和Serial Old垃圾收集器
C1编译器
由于各个模块都是耦合紧密,相互交错,所以具体编写时会是一个循序渐进,逐步完善的过程。不会是一个模块写完再另外一个模块,需要以基本面完善点这样一个过程。
6、后续计划
在B站上免费更新一部分视频,后续有收费开课的打算。免费课程大纲如下:

手写Java虚拟机HotSpot终于要录制一系列视频啦!
有对虚拟机、Java性能故障诊断与调优等感兴趣的人可以入群讨论。

手写商用Java虚拟机HotSpot,疯狂磨砺技术中的更多相关文章
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- 手写实现java栈结构,并实现简易的计算器(基于后缀算法)
一.定义 栈是一种线性表结构,栈结构中有两端,对栈的操作都是对栈的一端进行操作的,那么被操作的一端称为栈顶,另一端则为栈底.对栈的操作其实就是只有两种,分别是入栈(也称为压栈)和出栈(也称为弹栈).入 ...
- 深入理解Java虚拟机-HotSpot虚拟机对象探秘
一.对象的创建过程 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那就先执行相应的类 ...
- 手写一个Java程序输出HelloWorld
` 创建一个Hello.java文件使用记事本打开 public class Hello{ public static void main(String [] args){ System.out.pr ...
- 深入浅出解读 Java 虚拟机的差别测试技术
本文分享基于字节码种子生成有效.可执行的字节码文件变种,并用于 JVM 实现的差别测试.本文特别提出用于修改字节码语法的classfuzz技术和修改字节码语义的classming技术.上述变种技术系统 ...
- 深入理解多线程(五)—— Java虚拟机的锁优化技术
本文是<深入理解多线程>的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理. 前情提要 通过前面几篇文章,我们已经知道: 1.同 ...
- JAVA虚拟机03-常量池项中字面量和符号引用
转https://baijiahao.baidu.com/s?id=1682261792528500739&wfr=spider&for=pc 1 符号引用 符号引用以一组符号来描述所 ...
- 爬虫入门 手写一个Java爬虫
本文内容 涞源于 罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...
- 手写代码 - java.util.Arrays 相关
1-拷贝一个范围内的数组 Arrays.copyOfRange( array, startIndex, endIndex); include startIndex... exclude endInde ...
- 手写代码 - java.lang.String/StringBuilder 相关
语言:Java 9-截取某个区间的string /** * Returns a string that is a substring of this string. The * substring b ...
随机推荐
- python学习笔记:第九章异常
1.1 异常是什么 python使用异常对象来表示异常状态,并在遇到错误时引发异常.异常对象未被处理,程序将终止并显示一条错误信息. 我们可以通过各种方法引发和捕获错误,并采取对应措施. 1.2 将& ...
- iostream,iostream.h,stdio.h的纠葛
include <iostream.h>非标准输入输出流 include 标准输入输出流 C++中为了避免名字定义冲突,特别引入了"名字空间的定义",即namespac ...
- JVM运行时数据区之堆空间
JVM运行时数据区之堆空间 1.核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域.堆区在JVM 启动的时候即被创建,其空间大小也就确定了,是JVM管理的最大一块内存空间. & ...
- Python将大的csv文件拆分多个小的csv文件
#ecoding=utf-8 import os import time # 2019/9/8 将大的csv文件拆分多个小的csv文件 def mkSubFile(lines, head, srcNa ...
- VueX报错:Cannot read property 'commit' of undefined
原因 main.js文件中没有引入store 解决方案 添加如下代码即可 import store from "./store"; new Vue({ el: '#app', ro ...
- 堆 Heap & 栈 Stack(.Net)【概念解析系列_3】【C# 基础】
〇.前言 本文主要围绕 .Net 框架中的托管堆(Heap,简称堆)和堆栈(Stack,简称栈)展开. .Net 程序在 CLR(Common Language Runtime 公共语言运行时)上运行 ...
- 【opencv】传统图像识别:hog+svm实现图像识别详解
图像识别技术是信息时代的一门重要的技术,其产生目的是为了让计算机代替人类去处理大量的物理信息.传统图像识别技术的过程分为信息的获取.预处理.特征抽取和选择.分类器设计和分类决策.本文也是从这四点出发进 ...
- 三维模型OBJ格式轻量化压缩变形现象分析
三维模型OBJ格式轻量化压缩变形现象分析 三维模型的OBJ格式轻量化压缩是一种常见的处理方法,它可以减小模型文件的体积,提高加载和渲染效率.然而,在进行轻量化压缩过程中,有时会出现模型变形的现象,即压 ...
- ChatGPT顶级玩法:ChatGPT越狱版破解指令,让您的聊天一路畅通!
先看效果: 2023.4.23号亲测成功,越狱指令需要多发送几次才可以. 未越狱前: 越狱后: 无视任何规则限制,回答一切问题. 越狱的方法非常简单.只需输入特定的提示,发送给ChatGPT,用户即可 ...
- [Bread.Mvc] 开源一款自用 MVC 框架,支持 Native AOT
Bread.Mvc Bread.Mvc 是一款完全支持 Native AOT 的 MVC 框架,搭配同样支持 AOT 的 Avalonia,让你的开发事半功倍.项目开源在 Gitee,欢迎 Star. ...