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 参数,以及排查工具。

到这里,告一段落,其实HotSpotJVM规范的一种实现。如果更深层次去了解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初步了解的主要内容,如果未能解决你的问题,请参考以下文章

初步了解JVM第一篇

初步了解JVM第三篇(堆和GC回收算法)

初步了解jvm:jvm简介和简单调优

初步了解JVM

初步了解web

你的JVM还好吗?GC初步诊断