JVM 内存模型
线程共享
- 堆和方法区
线程私有
- 虚拟机栈 本地方法栈 程序计数器
方法区:
原来是通过永久代来实现,现在通过元空间实现,永久代是堆的一部分,元空间属于本地内存。元空间主要存储元信息,静态变量和常量池并入堆中。
静态变量 静态代码块 静态方法 构造代码块
堆
对象的非静态成员变量
栈内存
存储局部变量
类加载机制
七个阶段: 加载 验证 准备 解析 初始化 使用 卸载
加载
- 通过一个类的权限域名获取他的二进制字节流 - 将二进制字节流代表的静态存储结构转化为方法区运行的数据结构 - 将java 堆生成代表这个类的class 对象作为读取方法区数据的访问入口
- Xmx 最大堆内存 Xms 初始堆内存
四大引用
强引用我们平常new 这个对象
软引用:内存空间够就不会回收大
弱引用,不管空间是否够都能引用他。
虚引用主要用来跟踪垃圾回收的过程。
什么可以作为GCRPOOT 的引用对象
java 虚拟机栈中的引用对象
方法区中类静态属性引用对象
方法区产常量引用对象
本地方法栈中的引用对象
GC 回收的过程
1、发生Young GC之前进行检查,如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象总和的平均大小”,说明本次Young GC后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,此时会触发FullGC
2、当老年代没有足够空间存放对象时,会触发一次FullGC
3、如果元空间区域的内存达到了所设定的阈值-XX:MetaspaceSize=,也会触发FullGC。