JVM最全总结
2020-11-15 20:11:28 4 举报
jvm
作者其他创作
大纲/内容
A1 对象
15次
survice0(幸存0区)
MarkWord 64字节
ByteBuffer
young
Serial Old(串)整理
标记复制法
栈帧’
1)申请直接内存: allocateDirect底层是使用了 Unsafe 对象完成直接内存的分配回收,并且回收需要主动调用 freeMemory 方法2)回收直接内存:ByteBuffer 的实现类内部,使用了 Cleaner (虚引用)来监测 ByteBuffer 对象,一旦ByteBuffer 对象被垃圾回收,那么就会由 ReferenceHandler 线程通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存 public class Demo1_26 { static int _1Gb = 1024 * 1024 * 1024; /* * -XX:+DisableExplicitGC 显式的 */ public static void main(String[] args) throws IOException { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(_1Gb); System.out.println(\"分配完毕...\"); System.in.read(); System.out.println(\"开始释放...\"); byteBuffer = null; System.gc(); // 显式的垃圾回收,Full GC,ReferenceHandler线程检测ByteBuffer 被回收,则通过 Cleaner 的 clean 方法调用 freeMemory 来释放直接内存 System.in.read(); }}
数组长度
指向类对象
线程1
语法分析
通过直接调用native修饰的方法直接申请本地内存或者进行NIO操作
终结器引用
复习JVM内存模型:https://www.nowcoder.com/questionTerminal/8f393a761e0f4b67b1c442d092eb484d
字符串常量池stringtable
Parellel(并)复制
新生代 Young GC(1/3堆空间)
引用计数法
堆 Java Heap
old
Class对象_java_mirror 即 java 的类镜像_super 即父类_fields 即成员变量_methods 即方法_constants 即常量池_class_loader 即类加载器_vtable 虚方法表_itable 接口方法表
垃圾收集器--GC
A3对象
作为GC Root对象Class - 由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的,比如 rt.jarThread - 活着的线程,包括可运行,运行,阻塞状态Stack Local - Java方法的local变量或参数(局部变量表和本地方法栈引用的对象)JNI Local - JNI方法的local变量或参数,被native修饰的方法JNI Global - 全局JNI引用Monitor Used - 用于同步的监控对象Finalizable 在回收队列中的对象Unfinalized 覆盖了finalize方法的对象但是还没有被放入回收队列中的对象MAT工具可以查看gc root对象https://www.processon.com/diagraming/5f9faf90e0b34d03d7f4e998
初始化
people
使用
GC-root法
准备
survice1(幸存1区)
垃圾判断算法
卸载
语义分析
标记整理法
HelloWord.class
老年代 Old GC(占2/3堆空间)
Serial(串)复制
G1(并发)整理+复制
标记清除法
MetaSpace元空间(实现)
A4 对象finalize()
解析
C 对象(GC Root)
类型指针Kclass 8字节
软引用
直接内存
Direct Memory常见于 NIO 操作时,用于数据缓冲区分配回收成本较高,但读写性能高不受 JVM 内存回收管理可以通过ByteBuffer bb = ByteBuffer.allocateDirect(_1Mb); 直接申请本地内存
字节码文件
Minor GC
本地内存
二进制字节码(类基本信息,常量池,类方法定义,包含了虚拟机指令)类基本信息Classfile /D:/IntelIJWorkSpace/jvm/heima/target/classes/cn/itcast/jvm/t5/HelloWorld.class Last modified 2020-11-14; size 567 bytes MD5 checksum 8efebdac91aa496515fa1c161184e354 Compiled from \"HelloWorld.java\
局部变量表
其他进程
垃圾回收算法
1)强引用:只有所有 GC Roots 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收2)软引用,仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象,可以配合引用队列来释放软引用自身3)弱引用:仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象,可以配合引用队列来释放弱引用自身4)虚引用:必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存5)终结器引用:无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize方法,第二次 GC 时才能回收被引用对象
eden区刚new出来的对象
动态链接
ByteBuffer.allocateDirect原理
操作数栈
验证
1) 1.7之后,stringTable存放在堆空间,发生的是java.lang.OutOfMemoryError: Heap space2) 1.6存放在永久代,发生的是java.lang.OutOfMemoryError: PermGen spacehttps://www.cnblogs.com/cosmos-wong/p/12925299.html代码演示:jdk1.6和jdk1.8的代码效果的oom是不用的,jdk1.6是永久代溢出,jdk1.8是堆内存溢出https://github.com/heheliu321/jvm/blob/master/heima/src/main/java/cn/itcast/jvm/t1/stringtable/Demo1_6.java3)废弃字符串常量垃圾回收:以字面量为例,如果一个字符串\"abc\"一斤进入常量池,但是当前系统没有任何一个string引用指向“abc”的字面量,那么,如果发生垃圾回收并且有必要,“abc”会被系统移除常量池
Major GC
虚引用
弱引用
对象头
方法区
Full GC
public class HelloWorld { public static void main(String[] args) { System.out.println(\"hello world\"); }}
进入入老年代的条件1)年龄达到15次,可以通过参数 -XX:MaxTenuringThreshold=threshold 晋升阈值 调节2)Eden区域和Survice存放不下大对象,直接进入老年代,大对象就是需要大量连续内存空间的对象(比如:字符串、数组)
抽象语法树
实例数据
ParNew(并)复制
A2 对象
引用队列
HelloWord.java
连接
词法分析
注解抽象语法书
方法出口
java程序
8 : 1 : 1
CMS(并发)清除
记录出栈地址 即方法的返回地址或异常出口
Parellel Old(并)整理
类加载:类加载器将class文件加载到虚拟机的内存加载:在硬盘上查找并通过IO读入字节码文件连接:执行校验、准备、解析(可选)步骤校验:校验字节码文件的正确性准备:给类的静态变量分配内存,并赋予默认值解析:类装载器装入类所引用的其他所有类初始化:对类的静态变量初始化为指定的值,执行静态代码块
对齐填充-8字节倍数
动态链接(对陶、编译期没有指明,运行才指明)
类装载子系统
加载
理解为计算的数据存储区,使用load指令将数据加载到这里
字节码生成器
JVM参数:①基础参数:堆栈设置 -Xss:每个线程的栈大小 -Xms:初始堆大小,默认物理内存的1/64 -Xmx:最大堆大小,默认物理内存的1/4 -Xmn:新生代大小 -XX:NewSize:设置新生代初始大小 -XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。 -XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。 -XX:MetaspaceSize:设置元空间大小 -XX:MaxMetaspaceSize:设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展。垃圾回收统计信息 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename②高级参数: -XX:+UseSerialGC:设置串行收集器 -XX:+UseParallelGC:设置并行收集器 -XX:+UseParallelOldGC:老年代使用并行回收收集器 -XX:+UseParNewGC:在新生代使用并行收集器 -XX:+UseParalledlOldGC:设置并行老年代收集器 -XX:+UseConcMarkSweepGC:设置CMS并发收集器 -XX:+UseG1GC:设置G1收集器 -XX:ParallelGCThreads:设置用于垃圾回收的线程数
0 条评论
下一页