概念

JVM是Java Virtual Machine(Java虚拟机)的缩写。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

位置

类加载器

作用

加载Class文件 - new student()

类型

  1. 虚拟机自带的加载器
  2. 启动类(根)加载器
  3. 扩展类加载器
  4. 应用程序加载器

栈内存,主管程序的运行,生命周期和线程同步;

线程结束,栈内存也就是释放,对于栈来说,不存在垃圾回收的问题

栈的内容:8大基本类型结构+对象引用+实例的方法

栈运行原理:栈帧

栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法 (Method) 和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧 F1,并被压入到栈中

Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的

类加载器读取了类文件后,会将类,方法,常量,变量,和所有引用类型的真实对象保存在堆中

堆存在垃圾回收机制。

堆内存细分为三个区域:

  • 新生代(其中又细分为伊甸区和幸存者区)

  • 老年代

  • 元方法(原 永久代)

GC垃圾回收,主要在新生代和老年代

内存满了会爆OOM错误

99%都是临时对象

新生区

  • 对象:诞生 和成长的地方,甚至死亡;
  • 伊甸园,所有的对象都在此诞生
  • 幸存者区(0,1)

永久区

这个区域常驻内存,用来存放JDK自身携带的Class对象,Interface元数据,存储的是Java运行时的一些环境或类信息~, 这个区域不存在垃圾回收,关闭VM虚拟就会释放这个~

位置

jdk6及以前:永久代,常量池是在方法区

jdk7:永久代退化,常量池在堆中

jdk8:无永久代,常量池在元空间

堆内存调优

GC算法

JVM在进行GC(垃圾回收)时,分为三个区域,:新生区,幸存区,老年区,GC两种类:轻GC,重GC

题目:

  • JVM内存模型和分区
  • 堆里的分区有哪些,特点是什么
  • GC算法有哪些
  • 轻重GC什么时候发生

引用计数法

复制算法

  • 好处:没有内存的碎片
  • 坏处:浪费了内存空间~多了一半空间永远是空的。

复制算法最佳使用场景:对象存货度较低的时候:新生区~

标记清除算法

  • 优点:不需要额外的空间!
  • 缺点:两次扫描,严重浪费时间,会产生内存碎片,hash

标记压缩算法

对标记清除算法的再优化

总结

内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)

内存整齐度:复制算法=标记压缩算法>标记清除算法

内存利用率:标记压缩算法=标记清除算法>复制算法

GC:分代算法

年轻代:

  • 存活率低
  • 复制算法

老年代:

  • 区域大:存活率高
  • 标记清除算法(内存碎片不是太多)+标记压缩混合 实现