首页 > 编程语言 >手写商用Java虚拟机HotSpot,疯狂磨砺技术中

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

时间:2023-10-18 10:45:37浏览次数:37  
标签:Java 实现 虚拟机 HotSpot 编译器 C++

在当前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,编译器,C++
From: https://www.cnblogs.com/mazhimazhi/p/17771509.html

相关文章

  • linux centos7安装配置java环境
    1.先查看本地是否自带java环境:yumlistinstalled|grepjava2.卸载自带的java(输入su,输入root超级管理员的密码,切换到root用户模式)yum-yremovejava-1.8.0-openjdk*yum-yremovetzdata-java*3.查看yum仓库中的java安装包yum-ylistjava*4.安装java:yum-yi......
  • JAVA爬虫被封IP问题的解决方法
    以下是JAVA爬虫被封IP问题的解决方法:解决Java爬虫被封IP问题随着网络技术的发展,Java爬虫在网络应用中越来越普遍,然而在爬取数据的过程中,经常会遇到IP被封的问题。以下是几种常见的解决方法:1.使用代理IP代理IP可以隐藏爬虫的真实IP地址,从而提高爬虫的隐蔽性,减少被封IP的风险。可以......
  • java图片转base64(不换行)
    publicstaticStringImageToBase64(StringimgPath){InputStreamin=null;byte[]data=null;//读取图片字节数组try{in=newFileInputStream(imgPath);data=newbyte[in.available()];in.read(data);in.close();}catc......
  • VM准备与安装Linux虚拟机(Base)
    用的VM17版本:该版本解决了老版本的一些蓝屏问题和兼容性问题https://download3.vmware.com/software/WKST-1700-WIN/VMware-workstation-full-17.0.0-20800274.exe密钥JU090-6039P-08409-8J0QH-2YR7FCentos7.6.1810(阿里云镜像)https://mirrors.aliyun.com/centos-......
  • 【实操】Java+百度ocr,实现图片识别文字小工具
    前言......
  • Java拾贝第四天——动态绑定机制
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么//根据面向对象3中提及的属性看对象,方法看指向。试想如下代码publicclassTest4{publicstaticvoidmain(String[]args){Basebase=newSub();System.out.println(base.sum());System......
  • java学习_01
    字面量类型整数类型不带小数点的数字小数类型带小数点的数字字符串类型用双括号括起来的内容字符类型用单引号括起来的,内容只有一个比如:'a','b','c'布尔类型布尔值,表示真假空类型一个特殊的值,空值null特殊字符'\t'制......
  • Redis的Java客户端
    Jedis以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用lettuce(Spring默认使用)Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。RedissionRedisso......
  • java基础漏洞学习----SQL注入漏洞
    java基础漏洞学习----SQL注入漏洞前置基础知识https://www.cnblogs.com/thebeastofwar/p/17759805.html执行SQL语句的几种方式1.Statement执行SQL语句java.sql.Statement是JavaJDBC下执行SQL语句的一种原生方式,执行语句时需要通过拼接来执行若拼接的语句没有经过过滤,将出......
  • 【Android面试】2023最新面试专题七:Java并发编程(二)
    6 ReentrantLock的实现原理这道题想考察什么?是否了解并发相关的理论知识是否对于锁机制有个全面的理论认知是否对于AQS原理有自己的理解考察的知识点锁的分类(公平锁、重入锁、重力度锁等等)ReentrantLock实现方式与Synchronized实现方式的异同点考生应该如何回答Java中的大部分同步......