1.深入理解Java虚拟机:JVM高级特性与最佳实践目录
2.OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
3.各位能推荐一下jvm权威的深入书籍吗?
4.学习到底是先深而后广,还是源源码阅读先广而后深呢?
5.浅入浅出Javac编译原理
深入理解Java虚拟机:JVM高级特性与最佳实践目录
本书深入探索Java虚拟机的奥秘,从入门到高级特性,码深带你领略JVM的深入世界。第一部分:走进Java
第1章以Java技术体系和历史为起点,源源码阅读展望Java技术未来,码深golanglog源码包括模块化、深入混合语言、源源码阅读多核并行和语言语法的码深扩展。实战环节教你自行编译JDK,深入从获取源码到构建环境的源源码阅读搭建,体验Java技术的码深底层实现。第二部分:自动内存管理机制
第2章讲解Java内存区域,深入如程序计数器、源源码阅读虚拟机栈、码深本地方法栈等,以及内存溢出的处理。通过实例演示,理解OutOfMemoryError的各类表现形式。第3章:垃圾收集器与内存分配
这部分深入剖析垃圾收集算法,windows系统泄露源码如标记-清除、复制、标记-整理和分代收集,介绍各类收集器如Serial、ParNew等,以及内存分配策略的原理。第三部分:虚拟机执行子系统
第6章讲解类文件结构,包括Class文件的版本和内容。第7章探讨类加载机制,如加载时机、过程和类加载器的运作。第四部分:程序编译与代码优化
第章介绍早期编译期优化,如Javac编译器的工作原理,以及Java语法糖的实现。第章关注运行期优化,如HotSpot虚拟机的即时编译器和编译优化技术。第五部分:高效并发
第章讲解Java内存模型和线程,以及第章的线程安全与锁优化策略,如何实现高性能并发。e盾模块源码OpenJDK-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
ZGC简介:
ZGC是Java垃圾回收器的前沿技术,支持低延迟、大容量堆、染色指针、读屏障等特性,自JDK起作为试验特性,JDK起支持Windows,JDK正式投入生产使用。在JDK中已实现分代收集,预计不久将发布,性能将更优秀。
ZGC特征:
1. 低延迟
2. 大容量堆
3. 染色指针
4. 读屏障
并发标记过程:
ZGC并发标记主要分为三个阶段:初始标记、并发标记/重映射、重分配。本篇主要分析并发标记/重映射部分源代码。
入口与并发标记:
整个ZGC源码入口是ZDriver::gc函数,其中concurrent()是一个宏定义。并发标记函数是concurrent_mark。
并发标记流程:
从ZHeap::heap()进入mark函数,快递单号录入 源码使用任务框架执行任务逻辑在ZMarkTask里,具体执行函数是work。工作逻辑循环从标记条带中取出数据,直到取完或时间到。此循环即为ZGC三色标记主循环。之后进入drain函数,从栈中取出指针进行标记,直到栈排空。标记过程包括从栈取数据,标记和递归标记。
标记与迭代:
标记过程涉及对象迭代遍历。标记流程中,ZGC通过map存储对象地址的finalizable和inc_live信息。map大小约为堆中对象对齐大小的二分之一。接着通过oop_iterate函数对对象中的指针进行迭代,使用ZMarkBarrierOopClosure作为读屏障,实现了指针自愈和防止漏标。
读屏障细节:
ZMarkBarrierOopClosure函数在标记非静态成员变量的指针时触发读屏障。慢路径处理和指针自愈是美食分享 app源码核心逻辑,慢路径标记指针,快速路径通过cas操作修复坏指针,并重新标记。
重映射过程:
读屏障触发标记后,对象被推入栈中,下次标记循环时取出。ZGC并发标记流程至此结束。
问题回顾:
本文解答了ZGC如何标记指针、三色标记过程、如何防止漏标、指针自愈和并发重映射过程的问题。
扩展思考:
ZGC在指针上标记,当回收某个region时,如何得知对象是否存活?答案需要结合标记阶段和重分配阶段的代码。
结束语:
本文深入分析了ZGC并发标记的源码细节,对您有启发或帮助的话,请多多点赞支持。作者:京东物流 刘家存,来源:京东云开发者社区 自猿其说 Tech。转载请注明来源。
各位能推荐一下jvm权威的书籍吗?
推荐JVM权威书籍如下:
初学者(8本):
1. 《深入理解Java虚拟机:JVM高级特性与实践(第3版)》
2. 《深入Java虚拟机(原书第2版)---SUN公司核心技术丛书》
3. 《实战JAVA虚拟机 JVM故障诊断与性能优化》
4. 《深入理解JVM & G1 GC》
5. 《Java虚拟机精讲》
6. 《自己动手写Java虚拟机》 - 张秀宏,使用Go实现的
7. 《自己动手写Python虚拟机》
8. 《深入浅出:Java虚拟机设计与实现》
进阶者(本):
1. 《揭秘Java虚拟机:JVM设计原理与实现》
2. 《虚拟机设计与实现:以JVM为例》
3. 《Java虚拟机规范-JavaSE8》
4. 《深入理解JVM字节码/Java核心技术系列》
5. 《解析Java虚拟机开发--权衡优化高效和安全的最优方案》
6. 《Java虚拟机基础教程》
7. 《深入解析Java虚拟机HotSpot》
8. 《深入理解Android:Java虚拟机ART (Chinese Edition)》
9. 《JRockit权威指南:深入理解JVM》
. 《深入Java虚拟机:JVM G1 GC的算法与实现》
. 《垃圾回收算法与实现》
. 《HotSpot实战》
深入者(5本):
1. 《虚拟机:系统与进程的通用平台》
2. 《JVM G1源码分析和调优》
3. 《深入剖析Java虚拟机 : 源码剖析与实例详解(基础卷)》
4. 《垃圾回收算法手册-自动内存管理的艺术》
5. 《GraalVM与Java静态编译:原理与应用林子熠》
这些书籍涵盖了JVM学习的各个方面,从初学者到深入者,适合不同层次的学习者。希望对你有所帮助。
学习到底是先深而后广,还是先广而后深呢?
通过这么多年的学习和思考,我的建议先深后广,因为当技术学到一定深度后,就会有触类旁通的能力,自己掌握的广度也自然有了深度。 但是在实际学习过程中,深度和广度是相互穿插着学习,比如学习并发编程时,首先学习 JDK 源码,然后学进去之后,开始看 JVM 源码,最后看 CPU 架构,在技术点逐渐深度研究的过程中,广度也得到了完善。
浅入浅出Javac编译原理
Java语言是程序员广泛使用的语言,不仅包括Java本身,还有JDK、J2EE、JVM等概念。新语言如groove、scale等与Java的关系,以及这些非Java语言为何能在JVM上运行,这些问题都值得探讨。本文将深入解析Java与JVM的关系,以及Javac编译器的功能。Javac编译器负责将Java语言规范转化为Java虚拟机语言规范,将Java源代码转化为class字节码。了解一门语言的底层编译机制是掌握该语言的基础,因此,本文将从Javac编译原理开始探讨。
1. Javac是什么?
Javac是一种编译器,负责将一种语言规范转化为另一种语言规范。对于C、C++、汇编等语言,采用边编译边执行的方式,直接编译为CPU可识别的目标机器码,执行时资源占用少,编译速度快。编译器的功能是将语言规范转化为机器码规范。而对于Java语言,由于引入了Java虚拟机,不能直接编译为CPU可识别的机器码,因此需要完全编译后才能执行,占用时间和空间较大。编译器(Javac)的功能是将Java源代码转化为JVM语言,Java虚拟机再将JVM语言编译为CPU可识别的目标机器码。
2. Javac编译器的基本结构
要了解Javac编译器的基本结构,首先要明白编译器将一种语言规范转化为另一种语言规范需要经过哪些步骤。这需要回顾大学时编译原理的知识。首先,读取源码,逐字节分析,找出语法关键词,如Java中的If、while、for等,识别合法的关键词。这个步骤是词法分析过程,结果形成符合Java规范的Token流。接下来,对这些token流进行语法分析,检查关键词是否符合Java语法规范,如If关键词后跟的是否是布尔表达式。语法分析的结果是形成符合Java规范的抽象语法树。语义分析是将复杂的语法转化为简单语法,如将for each转化为for循环结构,解释注解等。语义分析的结果是形成一个新的抽象语法树,更接近JVM语言的语法规则。最后,通过字节码生成器根据新的抽象语法树生成字节码,即将一个数据结构转化为另一个数据结构。代码生成器的结果是生成符合Java虚拟机规范的字节码。
3. 设计模式之访问者模式
在词法分析器、语法分析器、语义分析器和代码生成器中,存在多次遍历语法树的过程。每次遍历都会进行不同的处理动作,对语法树也要进行进一步处理。这实际上是采用访问者模式设计的,每次遍历都是一次访问者的执行过程。