1.OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
2.浅入浅出Javac编译原理
3.做后端开发需要学什么
4.Java虚拟机(Java Virtual Machine,码基简称JVM)
5.JDK、码基JRE、码基JVM,码基是码基什么关系?
OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
ZGC简介:
ZGC是Java垃圾回收器的前沿技术,支持低延迟、码基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函数在标记非静态成员变量的指针时触发读屏障。慢路径处理和指针自愈是核心逻辑,慢路径标记指针,快速路径通过cas操作修复坏指针,并重新标记。
重映射过程:
读屏障触发标记后,对象被推入栈中,下次标记循环时取出。ZGC并发标记流程至此结束。
问题回顾:
本文解答了ZGC如何标记指针、三色标记过程、如何防止漏标、指针自愈和并发重映射过程的问题。
扩展思考:
ZGC在指针上标记,当回收某个region时,百亿君源码如何得知对象是否存活?答案需要结合标记阶段和重分配阶段的代码。
结束语:
本文深入分析了ZGC并发标记的源码细节,对您有启发或帮助的话,请多多点赞支持。作者:京东物流 刘家存,来源:京东云开发者社区 自猿其说 Tech。转载请注明来源。
浅入浅出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++、ethusdt合约源码汇编等语言,采用边编译边执行的方式,直接编译为CPU可识别的目标机器码,执行时资源占用少,编译速度快。编译器的功能是将语言规范转化为机器码规范。而对于Java语言,由于引入了Java虚拟机,不能直接编译为CPU可识别的机器码,因此需要完全编译后才能执行,占用时间和空间较大。编译器(Javac)的功能是将Java源代码转化为JVM语言,Java虚拟机再将JVM语言编译为CPU可识别的目标机器码。
2. Javac编译器的基本结构
要了解Javac编译器的基本结构,首先要明白编译器将一种语言规范转化为另一种语言规范需要经过哪些步骤。这需要回顾大学时编译原理的知识。首先,读取源码,逐字节分析,找出语法关键词,如Java中的If、while、for等,识别合法的关键词。这个步骤是词法分析过程,结果形成符合Java规范的Token流。接下来,极品dde源码对这些token流进行语法分析,检查关键词是否符合Java语法规范,如If关键词后跟的是否是布尔表达式。语法分析的结果是形成符合Java规范的抽象语法树。语义分析是将复杂的语法转化为简单语法,如将for each转化为for循环结构,解释注解等。语义分析的结果是形成一个新的抽象语法树,更接近JVM语言的语法规则。最后,通过字节码生成器根据新的抽象语法树生成字节码,即将一个数据结构转化为另一个数据结构。代码生成器的结果是生成符合Java虚拟机规范的字节码。
3. 设计模式之访问者模式
在词法分析器、语法分析器、语义分析器和代码生成器中,存在多次遍历语法树的过程。每次遍历都会进行不同的处理动作,对语法树也要进行进一步处理。这实际上是采用访问者模式设计的,每次遍历都是一次访问者的执行过程。
做后端开发需要学什么
对于想要从事后端开发的Java初学者,主要的学习路径包括以下几个关键部分:
首先,打下扎实的基础,涵盖计算机系统、算法和编译原理等基础知识,这是构建坚实技术基础的基石。
其次,步入Web开发,要掌握HTML/CSS/JS,作为前端页面技术,它们是与用户交互的桥梁。接着是Servlet/JSP(J2EE)的学习,这是Java后端的核心,特别是马士兵的视频教程被广泛推荐。
数据库知识不可忽视,MySQL是入门佳选,同时学习JDBC操作数据库和数据库客户端工具,如navicat或SQLyog,有助于数据管理。
框架技能是必备的,目前SSM(Spring、Spring MVC、Mybatis)最为流行。学会搭建一个简单的增删改查项目,理解配置和原理,尽管初期可能不完全理解,但要能快速上手。在这个过程中,Maven作为项目管理工具,也会逐渐接触,只需了解基本用法即可。
最后,深入理解Java底层和JVM/JDK是核心,通过阅读源码和官方文档来提升对框架的掌握。在这个阶段,你的重点是掌握核心技术,为未来的职业生涯打下坚实基础。
Java虚拟机(Java Virtual Machine,简称JVM)
Java虚拟机(JVM)是Java语言的基础,负责执行Java字节码。它实现跨平台性,使Java程序能在不同硬件和操作系统上运行,无需修改代码。编写的Java源代码生成字节码,JVM加载并执行。提供内存管理、垃圾回收、安全性、线程管理等功能,确保程序稳定、安全、兼容。JVM适用于Windows、Linux、macOS等系统,实现代码一次编写,到处运行。
核心功能包括:解释或编译字节码为本地机器代码,实现程序执行;提供丰富的内存管理、安全性和多线程支持,保障程序可靠性和安全性;确保跨平台兼容性,无需针对特定平台修改代码。字节码与不同系统的JVM结合,构成Java语言“一次编译,随处运行”的独特优势。
综上所述,JVM作为Java程序运行的核心,其功能强大,确保了Java语言的跨平台性、稳定性和安全性。它将字节码转换为本地代码,执行程序。通过内存管理、垃圾回收、安全机制和线程管理,确保程序在各种环境下运行顺畅。字节码与不同操作系统上的JVM协同工作,实现了Java程序的“一次编写,到处运行”。
Java虚拟机(JVM)作为Java程序执行的关键,实现跨平台性,确保程序在不同系统上稳定运行。它执行字节码,提供内存管理、垃圾回收、安全和线程支持,保障Java程序的可靠性和兼容性。通过将字节码转换为本地代码,JVM使Java程序能够在Windows、Linux、macOS等操作系统上运行,实现“一次编译,到处运行”的优势。
JDK、JRE、JVM,是什么关系?
在 Java 技术栈中,JDK、JRE、JVM 三者的关系如同金字塔一般,层层相扣,构成了 Java 应用程序运行的基础。
JDK(Java Development Kit)是 Java 开发工具包,包含了 JRE 以及各种开发工具,如编译器、调试器等,用于构建和运行 Java 应用程序。
JRE(Java Runtime Environment)是 Java 运行环境,它包括了 JVM、Java 核心类库以及 Java 标准类库,使得 Java 应用程序可以在没有源代码的情况下在任何支持 JRE 的平台上运行。
JVM(Java Virtual Machine)则是 Java 虚拟机,是 Java 应用程序执行的核心,它将 Java 字节码解释为机器语言,使得 Java 程序可以在不同的硬件和操作系统上运行,实现“一次编写,到处运行”的目标。
谢飞机在面试中对这三个概念的了解显然不够深入,这提醒我们在学习 Java 技术栈时,不仅要了解各组件的基本功能,更要深入理解它们之间的关系和作用机制。
学习 Java 技术栈是一个不断探索和深入的过程,从 JDK、JRE、JVM 的关系入手,可以逐渐建立起对 Java 技术栈的全面理解。同时,学习如何使用这些工具和概念,以及它们在实际开发中的应用,也是提升 Java 开发能力的关键。