JVM入门笔记
概念
JVM是Java Virtual Machine(Java虚拟机)的缩写。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
位置
类加载器
作用
加载Class文件 - new student()
类型
- 虚拟机自带的加载器
- 启动类(根)加载器
- 扩展类加载器
- 应用程序加载器
栈
栈内存,主管程序的运行,生命周期和线程同步;
线程结束,栈内存也就是释放,对于栈来说,不存在垃圾回收的问题
栈的内容: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:分代算法
年轻代:
- 存活率低
- 复制算法
老年代:
- 区域大:存活率高
- 标记清除算法(内存碎片不是太多)+标记压缩混合 实现