写点什么

JVM 垃圾回收原理

用户头像
皮蛋
关注
发布于: 2020 年 12 月 21 日

JVM 组成部分:类加载器、运行时数据区、执行引擎

  • 类加载器:加载流程如下图(双亲委派)


  • 运行时数据区:

方法区(所有线程共享)

存储加载的字节码

java 栈(每个线程独享)

存储应用程序运行中的对象的引用;

堆(所有线程共享)

存储应用程序运行中创建的类实例对象;

程序技术寄存器(每个线程独享)

存储当前线程执行到哪一行字节码指令;

  • 执行引擎:转换成本地系统指令(支持跨平台的关键)


JVM 运行时垃圾回收方式以及内存分布:

  • 回收主要有三种方法:清理、压缩、复制

没有引用的对象被打标记后,清理操作后会把打标的对象清理掉,堆中会出现占用空间、空闲空间分散分布;压缩操作会对占用空间进行压缩,把空闲空间挤压到一起;复制操作会对占用空间进行复制移动放在一起;

  • 垃圾回收器的算法:

串行回收器、并行回收器、并发回收器 CMS、G1 垃圾回收器;


  • 内存分布:新生代、老年代、永久代

新生代:默认占 1/3 堆内存

主要分区:

  1. Eden 区:默认占 8/10 新生代空间

  2. SurvivoFrom 区:默认占 1/10 新生代空间

  3. 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】

用户头像

皮蛋

关注

趁着年轻把想实现的实现掉 2019.12.19 加入

又懒又笨

评论

发布
暂无评论
JVM 垃圾回收原理