Java虚拟机干货,虚拟机干货
Java虚拟机干货,虚拟机干货
参考URL:
Java虚拟机干货(一)
Java虚拟机干货(二)
Java虚拟机干货(四)
Java虚拟机干货(五)
Java虚拟机干货(六)
Java虚拟机干货(八)
一、字节码生成
1. 总体流程
源文件—(javac编译)—>class文件—(类加载器)—>内存
2. 当class文件被类加载器加载到内存(栈)后,由执行引擎对字节码进行解析或等效处理后,最后输出结果
3. java源文件到class文件步骤
4. class文件是一组二进制流,无任何符号间隔。前八位是魔数和版本号。
5. class结构
- 常量池:字面量和符号引用,入口u2类型数据代表常量池计数器
- 访问标识
- 类索引、父索引、接口索引:接口索引是一组u2类型数据集合
- 字段表:变量
- 方法表:方法属性
- 属性表:方法的代码、throws异常、行号、类名称、静态变量赋值、内部类
二、类的加载
1. 类只有当被使用的时候才被加载,加载到方法区,不使用时要卸载
2. 双亲委派模式:一层一层找父类的加载器,类和类的加载器在堆的永久代上
3. 类的加载过程:加载->连接 (验证/准备/解析)->初始化。初始化阶段将所有static关键字都初始化一遍
4. 类加载方式:隐式加载/显式加载,隐式异常/显式异常
2. JVM判断一个类是同一个类的条件:类名一致且加载这个类的ClassLoader是同一个实例
三、JVM内存结构
1. 堆:-Xms堆内起始大小 -Xmx堆内最大大小
2. 方法区(PermGen)可称为永久代:-XX:MaxPermGen永久代最大内存
四、垃圾回收判断条件
1. 作为根节点的对象:虚拟机栈,本地栈,方法区里static静态变量,方法区里final常量引用的对象
2. 引用类型
- 强引用:new,不会回收
- 软引用:内存溢出之前回收
- 弱引用:发现就回收
- 虚引用:作用就是当此对象被回收时,会收到一个系统通知
3. finalize()方法
- 当对象被gc回收时,触发finalize()方法,finalize方法可以实现将该对象重新引用
- 当一个对象没有和跟节点相连的引用链后,第一次标记是否自行实现finalize方法,否的话直接gc,是的话加入队列,排队触发finalize方法,第二次标记仍然没有引用链,则gc
4. 方法区主要存放已被JVM加载的类信息、常量、静态变量等数据
5. gc回收废弃的常量和无用的类。常量池中没有任何引用的常量被回收
6. 类的卸载条件
- 类的类加载器已经被回收
- 堆上不存在任何类的实例
- 类的对象没有任何引用,即不能通过反射访问该类的方法
五、垃圾回收 回收算法
1. 标记-清除算法:产生碎片,空间不连续,分配大对象时引发gc
3. Minor GC(新生代回收):对象从伊甸园移动到一个幸存者,或者在两个幸存者之间移动。一次移动年龄加一,GC年龄默认15,-XX:MaxTenuringThreshold设置年龄阈值。
3. Major GC(老年代回收)/Full GC(整个堆空间回收):老年代gc,比Minor GC慢十倍以上
4. Full GC触发条件:
- System.gc();
- 老年代空间不足,空间仍不足抛OOM:Java Heap Space
- 永久代空间不足,空间仍不足抛OOM:Perm Gen
- CMS GC时出现Promotion Fail和Concurrent Mode Failer
- 统计得到的minor GC晋升老年代的平均大小大于老年代剩余空间
5. promotion failed – concurrent mode failure
- Minor GC后, Survivor空间容纳不了剩余对象,将要放入老年代,老年代有碎片或者不能容纳这些对象
- -XX:UseCMSCompactAtFullCollection -XX:CMSFullGCBeforeCompaction=5也就是CMS在进行5次Full GC(标记清除)之后进行一次标记整理算法
- 或者调大新生代或者Survivor空间
6. concurrent mode failure
- CMS是和业务线程并发运行的,在执行CMS的过程中有业务对象需要在老年代直接分配,例如大对象,但是老年代没有足够的空间来分配
- +XX:CMSInitiatingOccupancyFraction默认情况是当旧生代已用空间为68%时,即触发CMS GC,可考虑调小这个值,提前CMS GC的触发,以保证旧生代有足够的空间
- 或者调大老年带的空间
六、垃圾收集器
1. Serial收集器 ParNew收集器 Parallel Scavenge收集器:串行、并行新生代收集器,复制算法, ParNew响应时间优先,CMS新生代默认收集器,Parallel吞吐量优先,无法与CMS搭配
2. 吞吐量=CPU运行用户代码时间/(CPU运行用户代码时间+垃圾回收时间)
4. Serial Old收集器 Parallel Old收集器:串行、并行老年代收集器,标记-整理算法,对应Serial和Parallel
5. CMS:并发标记清除老年代收集器,缺点产生大量碎片
七、执行引擎 class的执行
1. 栈帧大小不受运行期变量数据的影响
2. Java编译成class文件时,只是保存了方法的符号引用,而没有直接引用(即方法的内存地址)
相关文章
- 暂无相关文章
用户点评