JVM初步了解
Posted 瑾兰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM初步了解相关的知识,希望对你有一定的参考价值。
一探究竟-JVM
起因
说起一探究竟 JVM
也是机缘巧合。前段时间在学习,多线程相关知识。然后看了个Thread.start()
方法。想详细看看它底层到底是如何实现的。在java代码中只看到了strat0()
方法,不得不止步了。
new Thread(()->{
System.out.println("线程");
}).start();
java.lang.Thread
文件中 start()
方法,核心方法start0()
只有一个简单的声明:
private native void start0();
找不到这个方式具体的实现,唯一让我看到希望的一点 是方法开头的静态代码块,注册registerNatives()
方法。
public class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
// TODO: start0()方法在此静态代码块中注册,registerNatives()方法需要在openJdk Thread.c文件中找到
private static native void registerNatives();
static {
// 注册所有 native 方法
registerNatives();
}
//......
}
后来百度知道了一个常识: java中凡是用 native 修饰的方法,其实都是调用的本地c代码接口。也就是java虚拟机中的方法。
也就是需要找到我们的OpenJdk
Thread.c
[1]文件(其实就是HotSpot
源码)。
然后根据Thread.c
文件找到 java中的strat0()
方法在jvm层面 对应的方法。一路找下来,就能从HotSpot
源码 中找到对应的实现,这个过程中出现是各种个疑问:如何根据Thread.c
文件中方法名 找到具体文件的方法实现,方法是如何解析的。java中线程启动和销毁 在JVM
层面上具体做了什么操作... .... 反正最后,整个流程看下来,HotSpot
源码让我有点头晕。
不过我想要看的线程的启动和销毁过程,我大概知道是怎么回事了。虽然原理我还是没有理解他具体是怎么做的。
于是退而求其次,不看HotSpot
源码了,我还是来研究下它的java虚拟机的原理吧,HotSpot
,其实就是我最要要说的就是JVM
,称为java虚拟机。
我们都知道 java
开发运行是基于JDK
的,JDK
可以简单理解为两大部分:一部分是java
应用程序编程所需的API,相关工具类,还有一部分就是java
虚拟机。
java
文件,编译器编译后生成的字节码文件,通过JVM
将字节码文件翻译成所运行的机器语言的。起到java
文件与底层硬件之间隔离,所以说java
虚拟机是可以跨平台运行java
程序的。
JVM学习大纲
一、为什么要学习JVM
至于为什么要学习java
虚拟机,不言而喻了吧,一方面,能够更深层次的了解java
语言代码被编译成字节码之后是如何运行的。另一方面,这也是线上排查问题的基本功。
二、什么是java虚拟机
那么到底什么是java虚拟机呢?java虚拟机就是一个字节码翻译器,将字节码文件翻译成对应正在运行程序的机器码,确保字节码文件能够在各个系统正确运行。这时候你能够有一个初步认识,编译器是如何将java文件编译成class文件的。此时就需要了解编译器和字节码文件相关知识了。
三、从源代码到机器码到底发生了什么
从源代码到机器码到底发生了什么?总结下来就是先从源代码编译成字节码,然后在通过字节码转成机器码。
四、字节码文件结构是什么
字节码文件结构是什么?这块知识,说实话看的一头雾水,总之是根据规则,将16进制的二进制流字节码 按照 约定表表示具体含义,翻译成人话。这个约定表类似于摩斯密码本。我们可以,根据这个约定表看懂字节码文件是什么意思。到这里,其实我们知道了,源代码编译成字节码的流程。下面是最重要的关键步骤了。运行程序,并且输出结果。
五、JVM 是如何将字节码文件加载到内存中
JVM 是如何将字节码文件的内容加载到内存中的?java类加载机制
六、内存中是如何进行数据存放的
加载到内存之后又是如何进行数据存放的?这就涉及到了 JVM内存模型,java类加载机制。java虚拟机运行字节码文件, 将其放到java虚拟机的内存空间。之后进行一系列的操作,最后运行得到结果。
七、java 垃圾回收机制
八、JVM垃圾回收
九、垃圾回收的几种类型
十、jvm参数
当我们把数据加载并保存到内存之后,那么问题出现了,内存是有限的,程序必定要去及时回收内存。
那么我们需要了解java 垃圾回收机制、JVM垃圾回收、垃圾回收的几种类型。
到这里其实基本都差不多了。源代码到字节码,字节码到机器码,机器码到内存模型,从内存到垃圾回收。我们知道程序在线上部署运行,势必容易出现线上问题。这就涉及到运维的线上排查问题了。
关于JVM
那还需要了解JVM 参数,以及排查工具。
到这里,告一段落,其实HotSpot
是JVM
规范的一种实现。如果更深层次去了解JVM
,那就需要去看JVM
规范了。最后如果还想深扒,可以了解下HotSpot
的源码。
这两天,我放弃于HotSpot
源码,开始系统了解了下 java
虚拟机的原理,做个简单记录,作为我的一个入门的知识大纲。
引用
HotSpot 源码中的Thread.c文件[1]
Oracle JAVA SE核心技术文档[2]
References
[1]
HotSpot 源码中的Thread.c文件: http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/00cd9dc3c2b5/src/share/native/java/lang/Thread.c[2]
Oracle JAVA SE核心技术文档: https://www.oracle.com/java/technologies/javase/javase-core-technologies-apis.html
以上是关于JVM初步了解的主要内容,如果未能解决你的问题,请参考以下文章