面向火箭编程之JVM

107 阅读2分钟

Java 程序的执行过程

一个 Java 程序,首先经过 javac 编译成 .class 文件,然后 JVM 将其加载到方法区,执行引擎将会执行这些字节码。执行时,会翻译成操作系统相  关的函数。JVM 作为 .class 文件的翻译存在,输入字节码,调用操作系统函数。 

过程如下:Java 文件->编译器>字节码->JVM->机器码。 

JVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的  函数,完成我们想要的操作。

JVM、JRE、JDK 的关系

JVM 只是一个翻译,把 Class 翻译成机器识别的代码,但是需要注意,JVM 不会自己生成代码,需要大家编写代码,同时需要很多依赖类库,这个时  候就需要用到 JRE。 

JRE 是什么,它除了包含 JVM 之外,提供了很多的类库(就是我们说的 jar 包,它可以提供一些即插即用的功能,比如读取或者操作文件,连接网络,  使用 I/O 等等之类的)这些东西就是 JRE 提供的基础类库。JVM 标准加上实现的一大堆基础类库,就组成了 Java 的运行时环境,也就是我们常说的 JRE  (Java Runtime Environment)。 

但对于程序员来说,JRE 还不够。我写完要编译代码,还需要调试代码,还需要打包代码、有时候还需要反编译代码。所以我们会使用 JDK,因为 JDK还提供了一些非常好用的小工具,比如 javac(编译代码)、java、jar (打包代码)、javap(反编译<反汇编>)等。这个就是 JDK。

JVM+java类库=JRE + javac等工具=JDK

JVM 的内存区域

WeChat35bfc5b8bfcf8da89afff14be2781e9a.png WechatIMG64.jpeg

栈的数据结构:先进后出的数据结构。

垃圾回收(GC)

JVM的垃圾回收机制中,判断一个对象是否死亡,并不是根据是否还有对象对其有引用,而是通过可达性分析。对象之间的引用可以抽象成树形结构,通过树根(GC Roots)作为起点,从这些树根往下搜索,搜索走过的链称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明这个对象是不可用的,该对象会被判定为可回收的对象。

那么那些对象可作为GC Roots呢?主要有以下几种:

1.虚拟机栈(栈帧中的本地变量表)中引用的对象。 
2.方法区中类静态属性引用的对象。 
3.方法区中常量引用的对象 
4.本地方法栈中JNI(即一般说的Native方法)引用的对象。

垃圾收集算法

  • (1)标记-清除算法
  • (2)复制算法
  • (3)标记-整理算法

参考1:mp.weixin.qq.com/s?__biz=MzA…

参考2 双亲委派机制:www.jianshu.com/p/98b95b879…