在当前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,疯狂磨砺技术中的更多相关文章

  1. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  2. 手写实现java栈结构,并实现简易的计算器(基于后缀算法)

    一.定义 栈是一种线性表结构,栈结构中有两端,对栈的操作都是对栈的一端进行操作的,那么被操作的一端称为栈顶,另一端则为栈底.对栈的操作其实就是只有两种,分别是入栈(也称为压栈)和出栈(也称为弹栈).入 ...

  3. 深入理解Java虚拟机-HotSpot虚拟机对象探秘

    一.对象的创建过程 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那就先执行相应的类 ...

  4. 手写一个Java程序输出HelloWorld

    ` 创建一个Hello.java文件使用记事本打开 public class Hello{ public static void main(String [] args){ System.out.pr ...

  5. 深入浅出解读 Java 虚拟机的差别测试技术

    本文分享基于字节码种子生成有效.可执行的字节码文件变种,并用于 JVM 实现的差别测试.本文特别提出用于修改字节码语法的classfuzz技术和修改字节码语义的classming技术.上述变种技术系统 ...

  6. 深入理解多线程(五)—— Java虚拟机的锁优化技术

    本文是<深入理解多线程>的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理. 前情提要 通过前面几篇文章,我们已经知道: 1.同 ...

  7. JAVA虚拟机03-常量池项中字面量和符号引用

    转https://baijiahao.baidu.com/s?id=1682261792528500739&wfr=spider&for=pc 1 符号引用 符号引用以一组符号来描述所 ...

  8. 爬虫入门 手写一个Java爬虫

    本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...

  9. 手写代码 - java.util.Arrays 相关

    1-拷贝一个范围内的数组 Arrays.copyOfRange( array, startIndex, endIndex); include startIndex... exclude endInde ...

  10. 手写代码 - java.lang.String/StringBuilder 相关

    语言:Java 9-截取某个区间的string /** * Returns a string that is a substring of this string. The * substring b ...

随机推荐

  1. 彻底解决各种浏览器访问不了GitHub问题(注意代理)

    如果有穿墙插件如Google助手  VPN  SS 之类别 有可能被全局代理 首先关闭这些软件 或者浏览器插件 假设,您的本地代理端口为:1080 ,打开git base窗口进行按下列的方式设置.(在 ...

  2. [渗透测试]—4.2 Web应用安全漏洞

    在本节中,我们将学习OWASP(开放网络应用安全项目)发布的十大Web应用安全漏洞.OWASP十大安全漏洞是对Web应用安全风险进行评估的标准,帮助开发者和安全工程师了解并防范常见的安全威胁. 1. ...

  3. Blazor前后端框架Known-V1.2.4

    V1.2.4 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...

  4. 2023年郑州轻工业大学校赛邀请赛zzh

    第一次参加线下赛体验很好,面包和酸奶很好吃.ABL三题难度超出我们的能力范围,没能写出来,C题在读完题后,我们三个简单交流了一下,确定思路后我写的代码,一次AC,很顺利.D题简单的01背包,但我在写代 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (71)-- 算法导论7.1 1题

    参照图 7-1的方法,说明 PARTITION在数组 A=(13,19,9,5,12,8,7,4,21,2,6,11)上的操作过程. 文心一言: PARTITION 是一种常见的快速排序算法,其目的是 ...

  6. 文件上传的multipart/form-data属性,你理解了吗

    form表单经常用于前端发送请求,比如:用户填写信息.选择数据.上传文件,对于不同的场景,上传数据的格式也会有些区别. action action 表示该请求的 url 地址,定义在form上,请求的 ...

  7. cdn 引入的资源需要通过 externals 排除打包哦~

    cdn 指的是通过相互连接的网络系统,使用最靠近用户的服务器将音乐.图片等资源以高效率和低成本的方式将内容传递给用户. 在 webpack 中,我们可能会将引入的第三方资源会编译成单独的文件,作为静态 ...

  8. .Net Web API 006 Controller上传大文件

    1.上传大文件的方式 上传大文件就需要一段一段的上传,主要是先在客户端获取文件的大小,例如想一次传256kb,那就按照256kb分割.分割后又两种上传方式. (1)逐个数据段读取,然后调用API上传, ...

  9. phpexcel图片获取

    phpexcel图片获取常见的两种方式: require_once dirname(__FILE__) . '/../Jn/PHPExcel.php'; $filePath = "123.x ...

  10. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇

    1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...