JVM(java虚拟机)详细介绍

Posted 一位懒得写博客的小学生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM(java虚拟机)详细介绍相关的知识,希望对你有一定的参考价值。

JVM

一、堆
new Object 所有对象都是存在此区域,此区域也是JVM中最大的一块区域。
Java垃圾回收器就是针对比区域。

二、 JVM 栈(JAVA 虚拟机栈)

  • 局部变量
  • 8大基础类型,对象的引用
  • 操作栈:每个方法都会对应一个操作栈
  • 动态链接:执行常量池的方法引用
  • 方法返回地址:PC 寄存器的地址

三、 本地方法栈

和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使⽤的,⽽本地⽅法栈是给本地⽅法使⽤的

四、 程序计数器
用来记录线程执行的行号

五、元空间(JDK 1.8)

  • JDK 1.7 方法区(永久代)
  • 运行时常量池、字符串常量池,类的元信息 JDK 1.7 的时候的方法区
  • JDK1.8 元空间:本地内存中分配,字符串常量池

堆划分:

-Xmx10m -> 堆最大容量
-Xms10m -> 堆最小容量的设置

新生代:第一次创建的对象都会分配到此区域。
老年代:经历了一定的垃圾回收(GC)15次之后,依然存活下来的对象会移动到老年代;大对象在创建的时候也会直接进入老年代。

新生代区域划分
Eden:80% 内存
S0:10% 内存
S1:10% 内存

为什么大对象会直接进去老年代?

核心原因是因为大对象的初始化比较耗时,频繁的创建和消耗会带来一定的性能开销,最好的实现方式是将它存入GC频率更低的老年代。

内存布局小结



JVM 调优的时候可以设置的参数类型:

  • -X:非标准的参数设置,它只是针对特殊的 HotSpot 生效
  • -XX:标准参数设置,针对所有 HotSpot 生效
  • -D:设置应用程序的参数。

小结

线程私有
JVM栈
本地方法栈
程序计数器
线程共享
元空间

JVM 类加载机制

加载

  1. 根据类路劲全名加载二进制流
  2. 将静态的存储结构转换成运行时的数据结构
  3. 在内存中生成一个此类的方法入口

校验

  1. 文件格式进行校验
  2. 字节码校验
  3. 符号引用验证

准备

  1. 将类中静态变量在内存中分配并设置类变量初始值

解析

  • 初始化 final 修饰的常量
  • 将常量的符号引用替换成直接引用的过程。

初始化

  • 开始将执行权从 JVM 转移到自己写的程序,开始执行构造函数。

使用
卸载

字面量:”abc“
符号引用:类,方法的完全限定名。
直接引用:将符号引用加载到内存中。

JVM 双亲委派模型

当加载一个类的时候,这个类不会直接加载,而是将这个加载任务直接交给父类。当找不到父类的时候,才自己去尝试加载。

优点
唯一性 (父类执行加载一次)
安全性 (会往上找,而上层的类是系统提供的类,避免加载自定义的类,一定程度上保证了安全性)

破坏双亲委派模型

  1. JDK 1.2 提出,为了兼容老代码,出现破坏;
  2. 因自身缺点而导致,如在父类当中调用子类的方法无法实现;
  3. 人们对于热更新的追求

垃圾回收

判别死亡对象判别算法

引用计数器

给每一个对象创建一个计数器,当有程序引用此类的时候计数器+1,不适用的时候计数器-1,当计数器为0时,表示对象无人用,就可以将它归为死亡对象。

引用计数器算法缺点:
会有循环引用的问题:HotSpot 默认的垃圾回收器使用的不是引用计数器算法。

JVM 参数 -XX/-X/-D
-XX:标准设置 所有 HotSpot 都⽀持的参数。
-X:⾮标准设置 特定的 HotSpot 才⽀持的参数。
-D:程序参数设置 程序中使⽤:System.getProperty(“获取”)

可达性分析

GC roots

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

垃圾回收算法

标记、清除算法

先标记再清除,缺点是存在内存碎片

复制算法

将内存分为两块,⼀半使⽤,另⼀半在 GC 是将存活的对象放进去,然后清除。
优点是性能⾼,但内存利⽤率不⾼。
【新⽣代使⽤的此算法】

标记、整理算法

将存活的对象都向⼀端移动,然后直接清理掉端边界以外的内存。
【⽼⽣代使⽤的是此算法】

垃圾收集器

Serial

单线程收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程。

ParNew

Serial收集器的多线程版本,除了使⽤多条线程进⾏垃圾收集之外,其余⾏为包括Serial收集器可⽤的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全⼀样,在实现上,这两种收集器也共⽤了相当多的代码。

Parallel Scavenge 并⾏GC收集器

它是⼀个新⽣代收集器,它也是使⽤复制算法的收集器,⼜是并⾏的多线程收集器。

CMS 收集器

CMS(Concurrent Mark Sweep)收集器是⼀种以获取最短回收停顿时间为⽬标的收集器.

CMS收集器是基于“标记—清除”算法实现的,它的运作过程相对于前⾯⼏种收集器来说更复杂⼀些,整个过程分为4个步骤:

  1. 初始标记(STW)
  2. 并发标记
  3. 重新标记(STW)
  4. 并发清除

G1收集器

G1(Garbage First)垃圾回收器是⽤在heap memory很⼤的情况下,把heap划分为很多很多的region块,然后并⾏的对其进⾏垃圾回收。JDK 11 默认垃圾回收器。

G1垃圾回收器在清除实例所占⽤的内存空间后,还会做内存压缩。

JMM(3大特征)

  1. 原子性;
  2. 可见性;
  3. 有序性;

以上是关于JVM(java虚拟机)详细介绍的主要内容,如果未能解决你的问题,请参考以下文章

JVM(java虚拟机)详细介绍

详细介绍Java虚拟机(JVM)

详细介绍Java虚拟机(JVM)

书籍推荐:《实战Java虚拟机——JVM故障诊断与性能优化》

书籍推荐:《实战Java虚拟机——JVM故障诊断与性能优化》下载

面试Java虚拟机(JVM)面试题