1.jdk是源源码什么
2.JVM作用JDK是什么
3.JDK、JRE、源源码JVM,源源码是源源码什么关系?
4.JVM、JRE、源源码JDK有什么联系和区别
5.详解JVMå·¥ä½åçåç¹ç¹
6.OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
jdk是源源码redis源码解答什么
JDK是Java语言的软件开发工具包,主要用于移动设备、源源码嵌入式设备上的源源码java应用程序。JDK是源源码整个java开发的核心,它包含了JAVA的源源码运行环境(JVM+Java系统类库)和JAVA工具。没有JDK的源源码话,无法编译Java程序(指java源码.java文件),源源码如果想只运行Java程序(指class或jar或其它归档文件),源源码要确保已安装相应的源源码JRE。
SE(JavaSE),源源码standard edition,标准版,是我们通常用的一个版本,从JDK5.0开始,改名为JavaSE。
EE(JavaEE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK5.0开始,改名为JavaEE。从年2月日开始,J2EE改名为JakartaEE。
ME(J2ME),micro edition,主要用于移动设备、icrm系统源码嵌入式设备上的java应用程序,从JDK5.0开始,改名为JavaME。
JDK包含的基本组件
1、javac:编译器,将源程序转成字节码。
2、jar:打包工具,将相关的类文件打包成一个文件。
3、javadoc:文档生成器,从源码注释中提取文档。
4、jdb:debugger,查错工具。
5、java:运行编译后的java程序(.class后缀的)。
6、appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。
7、Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。
8、Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
9、Jconsole:Java进行系统调试和监控的工具。
以上内容参考百度百科-JDK
JVM作用JDK是ubbo 源码分析什么
JVM是指Java虚拟机,其作用如下:
Java语言编译程序只需生成在Java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心,它包含了Java的运行环境和Java工具。
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 开发能力的关键。
JVM、JRE、JDK有什么联系和区别
首先是JDKJDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。
然后我们来看JRE
JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)
最后JVM也一目了然了
JVM是涨停股源码Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
由上图一目了然:
JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。
JVM体系结构与运行原理:
Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行。
JVM整个类加载过程的步骤:
1. 装载
装载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通过ClassLoader来完成类的加载,同样,也采用以上三个元素来标识一个被加载了的类:类名 包名 ClassLoader实例ID。
2. 链接
链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类。
完成校验后,JVM初始化类中的静态变量,并将其值赋为默认值。
最后对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应的权限(例如public、private域权限等),会造成NoSuchMethodError、NoSuchFieldError等错误信息。
3. 初始化
初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发执行:
调用了new;
反射调用了类中的方法;
子类调用了初始化;
JVM启动过程中指定的初始化类。
ClassLoader抽象类的几个关键方法:
(1) loadClass
此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从parent ClassLoader中寻找,如仍然没找到,则从System ClassLoader中寻找,最后再调用findClass方法来寻找,如要改变类的加载顺序,则可覆盖此方法
(2) findLoadedClass
此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。
(3) findClass
此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。
(4) findSystemClass
此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找,如仍然为找到,则返回null。
(5) defineClass
此方法负责将二进制的字节码转换为Class对象
(6) resolveClass
此方法负责完成Class对象的链接,如已链接过,则会直接返回。
JVM运行时数据区:
第一块:PC寄存器
PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。
第二块:JVM栈
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址
第三块:堆(Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。
第四块:方法区域(Method Area)
(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
第五块:运行时常量池(Runtime Constant Pool)
存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。
第六块:本地方法堆栈(Native Method Stacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。
详解JVMå·¥ä½åçåç¹ç¹
ããJVMå·¥ä½åçåç¹ç¹ä¸»è¦æ¯ææä½ç³»ç»è£ å ¥JVMæ¯éè¿jdkä¸Java exeæ¥å®æ éè¿ä¸é¢ æ¥æ¥å®æJVMç¯å¢ãã å建JVMè£ è½½ç¯å¢åé ç½®
ãã è£ è½½JVM dll
ãã åå§åJVM dll并æçå°JNIENV(JNIè°ç¨æ¥å£)å®ä¾
ãã è°ç¨JNIEnvå®ä¾è£ 载并å¤çclassç±»
ããå¨æ们è¿è¡åè°è¯Javaç¨åºçæ¶å ç»å¸¸ä¼æå°ä¸ä¸ªJVMçæ¦å¿µ JVMæ¯Javaç¨åºè¿è¡çç¯å¢ ä½æ¯ä»åæ¶ä¸ä¸ªæä½ç³»ç»çä¸ä¸ªåºç¨ç¨åºä¸ä¸ªè¿ç¨ å æ¤ä»ä¹æä»èªå·±çè¿è¡ççå½å¨æ ä¹æèªå·±ç代ç åæ°æ®ç©ºé´
ããé¦å æ¥è¯´ä¸ä¸JVMå·¥ä½åçä¸çjdkè¿ä¸ªä¸è¥¿ ä¸ç®¡ä½ æ¯åå¦è è¿æ¯é«æ æ¯j eeç¨åºåè¿æ¯j seç¨åºå jdkæ»æ¯å¨å¸®æ们åä¸äºäºæ æ们å¨äºè§£Javaä¹åé¦å 大å¸ä»¬ä¼ç»æ们æä¾è¯´jdkè¿ä¸ªä¸è¥¿ å®å¨Javaæ´ä¸ªä½ç³»ä¸å å½çä»ä¹è§è²å¢?æå¾æå¹sun大å¸ä»¬è®¾è®¡å¤©æ è½æä¸ä¸ªå¦æ¤å®æ´çä½ç³»ç»æåçå¦æ¤å®ç¾ jdkå¨è¿ä¸ªä½ç³»ä¸å å½ä¸ä¸ªç产å å·¥ä¸å¿ 产çææçæ°æ®è¾åº æ¯æææ令åæç¥çæ§è¡ä¸å¿ æ¬èº«å®æä¾äºJavaçå®æ´æ¹æ¡ å¯ä»¥å¼åç®åJavaè½æ¯æçææåºç¨åç³»ç»ç¨åº è¿é说ä¸ä¸ªé®é¢ 大家ä¼é® é£ä¸ºä»ä¹è¿æj me j eeè¿äºä¸è¥¿ è¿ä¸¤ä¸ªä¸è¥¿ç®çå¾ç®å åå«ç¨æ¥ç®ååèªé¢åå çå¼ååæ建è¿ç¨ jdké¤äºJVMä¹å¤ è¿æä¸äºæ ¸å¿çAPI éæAPI ç¨æ·å·¥å · å¼åææ¯ å¼åå·¥å ·åAPIçç»æ
ããå¥½äº åºè¯è¯´äºé£ä¹å¤ æ¥ç¹äºä¸»é¢ç¸å ³çä¸è¥¿å§ JVMå¨æ´ä¸ªjdkä¸å¤äºæåºå± è´è´£äºæä½ç³»ç»çäº¤äº ç¨æ¥å±è½æä½ç³»ç»ç¯å¢ æä¾ä¸ä¸ªå®æ´çJavaè¿è¡ç¯å¢ å æ¤ä¹å°±èæ计ç®æº æä½ç³»ç»è£ å ¥JVMæ¯éè¿jdkä¸Java exeæ¥å®æ éè¿ä¸é¢ æ¥æ¥å®æJVMç¯å¢
ãã å建JVMè£ è½½ç¯å¢åé ç½®
ãã è£ è½½JVM dll
ãã åå§åJVM dll并æçå°JNIENV(JNIè°ç¨æ¥å£)å®ä¾
ãã è°ç¨JNIEnvå®ä¾è£ 载并å¤çclassç±»
ããä¸ï¼JVMè£ å ¥ç¯å¢ JVMæä¾çæ¹å¼æ¯æä½ç³»ç»çå¨æè¿æ¥æ件ï¼æ¢ç¶æ¯æ件é£å°±ä¸ä¸ªè£ å ¥è·¯å¾çé®é¢ Javaæ¯æä¹æ¾è¿ä¸ªè·¯å¾çå¢ï¼å½ä½ å¨è°ç¨Java testçæ¶å æä½ç³»ç»ä¼å¨pathä¸å¨ä½ çJava exeç¨åº Java exeå°±éè¿ä¸é¢ä¸ä¸ªè¿ç¨æ¥ç¡®å®JVMçè·¯å¾åç¸å ³çåæ°é ç½®äºï¼ä¸é¢åºäºWindowsçå®ç°çåæï¼
ããé¦å æ¥æ¾jreè·¯å¾ Javaæ¯éè¿GetApplicationHome apiæ¥è·å¾å½åçJava exeç»å¯¹è·¯å¾ c:\j sdk _ \bin\Java exe é£ä¹å®ä¼æªåå°ç»å¯¹è·¯å¾c:\j sdk _ \ å¤æc:\j sdk _ \bin\Java dllæ件æ¯å¦åå¨ å¦æåå¨å°±æc:\j sdk _ \ä½ä¸ºjreè·¯å¾ å¦æä¸åå¨åå¤æc:\j sdk _ \jre\bin\Java dllæ¯å¦åå¨ å¦æåå¨è¿c:\j sdk _ \jreä½ä¸ºjreè·¯å¾ï¼å¦æä¸åå¨è°ç¨GetPublicJREHomeæ¥HKEY_LOCAL_MACHINE\Sofare\JavaSoft\Java Runtime Environment\ å½åJREçæ¬å· \JavaHomeçè·¯å¾ä¸ºjreè·¯å¾
ãã
ããç¶åè£ è½½JVM cfgæ件JREè·¯å¾+\lib+\ARCHï¼CPUææ¶ï¼+\JVM cfgARCHï¼CPUææ¶ï¼çå¤ææ¯éè¿Java_md cä¸GetArchå½æ°å¤æç 该å½æ°ä¸windowså¹³å°åªæ两ç§æ åµ WIN ç ia å ¶ä»æ åµé½ä¸º i 以æçä¸ºä¾ C:\j sdk _ \jre\lib\i \JVM cfg 主è¦çå 容å¦ä¸ client KNOWN server KNOWN hotspot ALIASED_TO client classic WARN native ERROR green ERROR
ããå¨æ们çjdkç®å½ä¸jre\bin\serveråjre\bin\clienté½æJVM dllæ件åå¨ èJavaæ£æ¯éè¿JVM cfgé ç½®æ件æ¥ç®¡çè¿äºä¸åçæ¬çJVM dllçï¼éè¿æ件æ们å¯ä»¥å®ä¹ç®åjdkä¸æ¯æé£äºJVM åé¢é¨åï¼clientï¼æ¯JVMå称 åé¢æ¯åæ° KNOWN表示JVMåå¨ ALIASED_TO表示ç»å«çJVMåä¸ä¸ªå«å WARN表示ä¸åå¨æ¶æ¾ä¸ä¸ªJVMæ¿ä»£ ERROR表示ä¸åå¨æåºå¼å¸¸ï¼å¨è¿è¡Java XXXæ¯ Java exeä¼éè¿CheckJVMTypeæ¥æ£æ¥å½åçJVMç±»å Javaå¯ä»¥éè¿ä¸¤ç§åæ°çæ¹å¼æ¥æå®å ·ä½çJVMç±»å ä¸ç§æç §JVM cfgæ件ä¸çJVMå称æå® ç¬¬äºç§æ¹æ³æ¯ç´æ¥æå® å®ä»¬æ§è¡çæ¹æ³åå«æ¯ Java J Java XXaltJVM= æ Java J XXaltJVM= å¦ææ¯ç¬¬ä¸ç§åæ°ä¼ éæ¹å¼ CheckJVMTypeå½æ°ä¼ååæ° J åé¢çJVMå称 ç¶åä»å·²ç¥çJVMé ç½®åæ°ä¸æ¥æ¾å¦ææ¾å°ååçåå»æ该JVMå称åç ç´æ¥è¿åè¯¥å¼ è第äºç§æ¹æ³ ä¼ç´æ¥è¿å XXaltJVM= æ J XXaltJVM= åé¢çJVMç±»åå称 å¦æå¨è¿è¡Javaæ¶æªæå®ä¸é¢ä¸¤ç§æ¹æ³ä¸çä»»ä¸ä¸ç§åæ° CheckJVMTypeä¼åé ç½®æ件ä¸ç¬¬ä¸ä¸ªé ç½®ä¸çJVMå称 å»æå称åé¢ç è¿åè¯¥å¼ CheckJVMTypeå½æ°çè¿ä¸ªè¿åå¼ä¼å¨ä¸é¢çå½æ°ä¸æ±åjreè·¯å¾ç»åæJVM dllçç»å¯¹è·¯å¾ å¦æ没ææå®è¿ä¼ä½¿ç¨JVM cfgä¸ç¬¬ä¸ä¸ªå®ä¹çJVM å¯ä»¥éè¿set _Java_LAUNCHER_DEBUG= å¨æ§å¶å°ä¸æµè¯ï¼
ããæåè·å¾JVM dllçè·¯å¾ JREè·¯å¾+\bin+\JVMç±»åå符串+\JVM dllå°±æ¯JVMçæ件路å¾äº ä½æ¯å¦æå¨è°ç¨Javaç¨åºæ¶ç¨ XXaltJVM=åæ°æå®çè·¯å¾path å°±ç´æ¥ç¨path+\JVM dllæ件å为JVM dllçæ件路å¾ï¼
ããäº è£ è½½JVM dll
ããéè¿ç¬¬ä¸æ¥å·²ç»æ¾å°äºJVMçè·¯å¾ Javaéè¿LoadJavaVMæ¥è£ å ¥JVM dllæ件ï¼è£ å ¥å·¥ä½å¾ç®åå°±æ¯è°ç¨Windows APIå½æ°
ããLoadLibraryè£ è½½JVM dllå¨æè¿æ¥åºï¼ç¶åæJVM dllä¸ç导åºå½æ°JNI_CreateJavaVMåJNI_GetDefaultJavaVMInitArgsææ¥å°InvocationFunctionsåéçCreateJavaVMåGetDefaultJavaVMInitArgså½æ°æéåéä¸ JVM dllçè£ è½½å·¥ä½å®£åå®æ
ããä¸ åå§åJVM è·å¾æ¬å°è°ç¨æ¥å£ è¿æ ·å°±å¯ä»¥å¨Javaä¸è°ç¨JVMçå½æ°äºï¼è°ç¨InvocationFunctionsï¼>CreateJavaVMä¹å°±æ¯JVMä¸JNI_CreateJavaVMæ¹æ³è·å¾JNIEnvç»æçå®ä¾ï¼
ããå è¿è¡Javaç¨åºï¼
ããJavaç¨åºæ两ç§æ¹å¼ä¸ç§æ¯jarå ä¸ç§æ¯class è¿è¡jar Java jar XXX jarè¿è¡çæ¶å Java exeè°ç¨GetMainClassNameå½æ° 该å½æ°å è·å¾JNIEnvå®ä¾ç¶åè°ç¨Javaç±»Java util jar JarFileJNIEnvä¸æ¹æ³getManifest()并ä»è¿åçManifest对象ä¸ågetAttributes( Main Class )çå¼å³jarå ä¸æ件 META INF/MANIFEST MFæå®çMain Classç主类åä½ä¸ºè¿è¡ç主类 ä¹åmainå½æ°ä¼è°ç¨Java cä¸LoadClassæ¹æ³è£ 载该主类ï¼ä½¿ç¨JNIEnvå®ä¾çFindClassï¼ mainå½æ°ç´æ¥è°ç¨Java cä¸LoadClassæ¹æ³è£ 载该类 å¦ææ¯æ§è¡classæ¹æ³ mainå½æ°ç´æ¥è°ç¨Java cä¸LoadClassæ¹æ³è£ 载该类
ããç¶åmainå½æ°è°ç¨JNIEnvå®ä¾çGetStaticMethodIDæ¹æ³æ¥æ¾è£ è½½çclass主类ä¸
ãã public static void main(String[] args) æ¹æ³ 并å¤æ该æ¹æ³æ¯å¦ä¸ºpublicæ¹æ³ ç¶åè°ç¨JNIEnvå®ä¾ç
ããCallStaticVoidMethodæ¹æ³è°ç¨è¯¥Javaç±»çmainæ¹æ³
lishixinzhi/Article/program/Java/hx//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函数在标记非静态成员变量的指针时触发读屏障。慢路径处理和指针自愈是核心逻辑,慢路径标记指针,快速路径通过cas操作修复坏指针,并重新标记。
重映射过程:
读屏障触发标记后,对象被推入栈中,下次标记循环时取出。ZGC并发标记流程至此结束。
问题回顾:
本文解答了ZGC如何标记指针、三色标记过程、如何防止漏标、指针自愈和并发重映射过程的问题。
扩展思考:
ZGC在指针上标记,当回收某个region时,如何得知对象是否存活?答案需要结合标记阶段和重分配阶段的代码。
结束语:
本文深入分析了ZGC并发标记的源码细节,对您有启发或帮助的话,请多多点赞支持。作者:京东物流 刘家存,来源:京东云开发者社区 自猿其说 Tech。转载请注明来源。
jdk是什么?
JDK是Java语言的核心开发工具包,它对于在移动设备和嵌入式设备上开发Java应用程序至关重要。这个工具包包括Java运行环境(JVM和Java系统类库)以及一系列Java开发工具,如编译器、打包工具、文档生成器和调试器等。
没有JDK,你无法对Java源代码(.java文件)进行编译,这意味着你无法将其转化为可执行的程序。如果你想运行Java程序,比如.class或.jar文件,你需要事先安装Java运行环境(JRE),它提供了Java程序运行所需的环境,但不包含编译功能。
JDK的核心组件包括:javac编译器,它负责将源代码转换为字节码;jar打包工具,用于整理相关类文件;javadoc,可以从源代码注释中生成文档;jdb,是用于调试Java程序的工具;此外,appletviewer是一个小程序浏览器,可以运行HTML文件中的Java小程序。
总的来说,JDK是Java开发的基础,是连接源代码和可执行程序的关键桥梁,无论是开发还是运行Java应用,它的存在都是至关重要的。参考来源:[相关链接]