介绍

Java能够被称为“一次编译,到处运行”的原因就是Java屏蔽了很多的操作系统平台相关信息,使得Java只需要生成在JVM虚拟机运行的目标代码也就是所说的字节码,就可以在多种平台运行。

 

 

JDK 

JRE  java运行时环境的简称

 

 

JVM虚拟机构成

类加载子系统

JVM运行时数据区

执行引擎

【Java】JVM 虚拟机 原理_jdk

 

 

JVM底层原理

JVM跨平台

【Java】JVM 虚拟机 原理_java_02

 

 

 

 

 

栈 

数据结构->FILO

包含 栈帧  (局部变量表/操作数栈/方法出口)

 

先近后出

方法会存到栈里

存方法  变量

 

 

存对象

 

 

 

main方法

 

  栈FILO

   方法

 

  本地方法栈 native

 

【Java】JVM 虚拟机 原理_jvm_03

 

并发 CAS Atomic native 调用  C OR C++

 

 

新生代 1

Eden 8

from 1

to 1

老年代 3

 

共 600M

3:1

老年代400M

新生代200M

  新生代 8:1:1

 

 

知识点

对象逃逸

大对象提前进入老年代

 

 

新生代  age=15之后会进入老年代

老年代

来年代的收集算法是 标记-整理

【Java】JVM 虚拟机 原理_老年代_04

 

JVM调优

java为什么需要性能调优

gc root

硬件 = CPU + 内存 + 硬盘

软件 = 程序 = 数据结构 + 算法

JVM 内存有个临界点  到了这了临界点就不会再增加内存了 开始执行内存回收

 

 

实战

 

 

 

GC

minor gc

Eden 满了之后 触发 minor gc

根据 gc root 判断对象是否处于游离状态 (对象没有被引用,没有被其他地方调用)  是的话则被干掉 否则的话 进入 from区

每次 minor gc 后相同对象进入from区 则age+1

根据 gc root

 

 

当from区满了之后  将from区游离状态对象干掉 然后让 from区变为to区  to区变为from区  并将之前的from区数据copy到新的from区 并且对象的age+1

 

经历过 minor GC15 次 AGE=15 之后会进入老年代

普通GC

 

 

full gc

内存满了之后执行这个

老年代满了

full gc 会触发  STW=stop the world 不能提供任何服务(段时间)  可以理解为时间中止

 

 

 

工具

java VisualVM

监控内存

 

Java heap space  内存溢出  old老年代内存满了

 

 

GC 调优

GC 调优原则;

GC 调优目的;

GC 调优策略;

​​GC 调优原则​​

在调优之前,我们需要记住下面的原则:

多数的 Java 应用不需要在服务器上进行 GC 优化; 多数导致 GC 问题的 Java 应用,都不是因为我们参数设置错误,而是代码问题; 在应用上线之前,先考虑将机器的 JVM 参数设置到最优(最适合); 减少创建对象的数量; 减少使用全局变量和大对象; GC 优化是到最后不得已才采用的手段; 在实际使用中,分析 GC 情况优化代码比优化 GC 参数要多得多。

​​GC 调优目的​​

将转移到老年代的对象数量降低到最小; 减少 GC 的执行时间。

​​GC 调优策略​​

策略 1:将新对象预留在新生代,由于 Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代是明智的做法,实际项目中根据 GC 日志分析新生代空间大小分配是否合理,适当通过“-Xmn”命令调节新生代大小,最大限度降低新对象直接进入老年代的情况。

策略 2:大对象进入老年代,虽然大部分情况下,将对象分配在新生代是合理的。但是对于大对象这种做法却值得商榷,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配的老年代,破坏新生代的对象结构,可能会出现频繁的 full gc。因此,对于大对象,可以设置直接进入老年代(当然短命的大对象对于垃圾回收来说简直就是噩梦)。​​-XX:PretenureSizeThreshold​​ 可以设置直接进入老年代的对象大小。

策略 3:合理设置进入老年代对象的年龄,​​-XX:MaxTenuringThreshold​​ 设置对象进入老年代的年龄大小,减少老年代的内存占用,降低 full gc 发生的频率。

策略 4:设置稳定的堆大小,堆大小设置有两个参数:​​-Xms​​​ 初始化堆大小,​​-Xmx​​ 最大堆大小。

策略5:注意: 如果满足下面的指标,则一般不需要进行 GC 优化:

MinorGC 执行时间不到50ms; Minor GC 执行不频繁,约10秒一次; Full GC 执行时间不到1s; Full GC 执行频率不算频繁,不低于10分钟1次。