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文件时,只是保存了方法的符号引用,而没有直接引用(即方法的内存地址)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值