JVM内存模型

GC优化:https://tech.meituan.com/2017/12/29/jvm-optimize.html

jvm内存模型


程序计数器

是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的 程序计数器,这类内存也称为“线程私有”的内存。

虚拟机栈

是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每一个方法从调用直至执行完成 的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

本地方法栈

本地方法栈为Native方法服务

创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。
由于现代JVM采用分代收集算法, 因此Java堆从GC的角度还可以 细分为: 新生代( Eden From Survivor 和 To Survivor)和老年代。

方法区

存放已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
运行时常量池和元空间是方法区的一部分

java垃圾回收

https://yq.aliyun.com/articles/708634?utm_content=g_1000067014

判断对象是否为垃圾的算法

1)引用计数算法(一般不用)
优点 执行效率高,程序执行受影响小
缺点 无法检测出循环引用的情况,导致内存泄漏
2)可达性分析法:通过判断对象的引用链是否可达来决定对象是否可以被回收

垃圾回收算法

1)标记-清除算法
2)复制算法
解决了碎片化问题
顺序分配内存,简单高效
适用于对象存活率低的场景
3)标记-整理
4)分代收集算法(常用)
按照对象生命周期的不同划分区域以采用不同的垃圾回收算法
新生代:采用复制算法
老年代:采用用"标记-清除"或者"标记-整理"算法
永久代(方法区):同老年区 (1.8以后已经没有)

四种引用类型

引用类型 被垃圾回收时间 用途 生存时间
强引用 从来不会 对象的一般状态 JVM停止时终止
软引用 在内存不足时 对象缓存 内存不足时终止
弱引用 垃圾回收时 对象缓存 Gc运行后终止
虚引用 不确定 标记、哨兵 不确定
原文地址:https://www.cnblogs.com/flyuz/p/11507605.html