JVM 垃圾回收原理
JVM 组成部分:类加载器、运行时数据区、执行引擎
类加载器:加载流程如下图(双亲委派)
运行时数据区:
方法区(所有线程共享)
存储加载的字节码
java 栈(每个线程独享)
存储应用程序运行中的对象的引用;
堆(所有线程共享)
存储应用程序运行中创建的类实例对象;
程序技术寄存器(每个线程独享)
存储当前线程执行到哪一行字节码指令;
执行引擎:转换成本地系统指令(支持跨平台的关键)
JVM 运行时垃圾回收方式以及内存分布:
回收主要有三种方法:清理、压缩、复制
没有引用的对象被打标记后,清理操作后会把打标的对象清理掉,堆中会出现占用空间、空闲空间分散分布;压缩操作会对占用空间进行压缩,把空闲空间挤压到一起;复制操作会对占用空间进行复制移动放在一起;
垃圾回收器的算法:
串行回收器、并行回收器、并发回收器 CMS、G1 垃圾回收器;
内存分布:新生代、老年代、永久代
新生代:默认占 1/3 堆内存
主要分区:
Eden 区:默认占 8/10 新生代空间
SurvivoFrom 区:默认占 1/10 新生代空间
SurvivoTo 区:默认占 1/10 新生代空间
主要作用:
1.除大对象外 JVM 新创建的对象存放的地方
2.对象的创建和销毁区域(频繁)
3.触发 MinorGC 进行垃圾回收动作(频繁)
jvm 内存不足时 MinorGC 会进行 Eden 区垃圾回收,SurvivoFrom 区保存 Eden 区的幸存者,SurvivoTo 区将上一次 MinorGC 的幸存者,做为被扫描者;
MinorGC 算法:
1.首先把 Eden 区和 SurvivoFrom 区存活的对象放入 SurvivoTo 区,同时把年龄+1,如果有对象的年龄达到老年代标准或者 SurvivoTo 区内存不足时,把打标的对象放入老年代区;
2.清空 Eden 区和 SurvivoFrom 区对象;
3.SurvivoFrom 区和 SurvivoTo 区相互交换;
老年代:默认占 2/3 堆内存
主要作用:
存放大对象
长生命周期的对象
永久代:占内存比较少
主要保存加载的 class 文件;基本不会进行 MinorGC;
内存参数:
-Xms:初始堆大小
-XmX:最大堆大小
-Xmn :新生代大小、最大永久代大小
-Xss:线程堆栈大小
-XX:NewSize:新生代大小
-XX:MaxPermSize:最大永久代大小
-XX:NewRatio:新生代与老年代的比【=3 新生代与老年代的比为 1:3】
-XX:SurvivoRatio:Survivo 区与 Eden 区的比值【=8 Survivor:Eden 为 2:8】
评论