1.JVM发展及种类
任何一门语言都可以根据jvm规则编译成.class字节码文件来跨平台使用虚拟机
其实很多厂商都会做自己产品的jvm,但是通过TCK验证(就是专业的测试用例)才能是合格的jvm,咱们目前使用的一般都是Hotspot vm
下面来介绍sun产品下虚拟机的发展
- 图System.out.print输出100个的话就要用解释器解释100次同样的命令,对于性能来说并不高效。
- 那同理就会出现编译器,对于经常出现的热点的指令进行解析缓存,那么后续再次出现这个指令时可以不解析直接取缓存里的指令即可实现结果。但是最早的jvm是没有内置的,需要自己额外安装编译器。
- 解释器和编译器只能二选一,显然不合理。
2.其他jvm介绍
IBM j9 vm也只只是自称最快的JVM,而且一般都是使用IBM自家产品搭配使用最佳
前面都是国外的JVM,国内也有了JVM
Taobao vm 是淘宝应用场景使用的,性能还是蛮好的
再说一下Open JDK与SUN/Orcle jdk的异同?
sun jdk只能个人开发使用,不能商业使用
3.Java虚拟机构成
类加载子系统
内存:堆,方法区,虚拟机栈,程序计数器
执行引擎
4.对象分配中的流程?
分配对象时的流程?
- 首先新对象放入eden区,判断一下能否放入?
- 能够放下,直接存
- 不能放下,需要Minor GC(采用复制算法,将幸存者向Servivor复制)
- 当然放入Servivor也现需要判断是否能放的下?
- 能够放下,那对象age+1,判断age对象数量>15就放入老年代,小于放入Servivor
- 不能放下Servivor,申请加入老年代
- 判断老年代是否能放下对象
- 老年代放不下就会进行非常耗时的操作Full GC(年轻代,年老代都会进行垃圾收集,这个过程也叫全堆收集),清理过后如果能放下直接放入老年代,但如果FGC过后还是放不下抛出OOM内存溢出
其中标红线的地方都是容易出现特殊情况的流程
Minor GC,FULL GC,Major GC有什么区别?
任何GC行为都会触发全世界停止!
Minor GC (YGC)针对年轻代回收,执行效率高
Full GC,全堆回收,针对老年代/年轻代/方法区进行全面的回收,执行效率低下,会导致系统长时间停滞,减少Full GC是JVM优化的重点。
Major GC是针对老年代回收,目前只有CMS垃圾收集器才有Major GC。
为什么要对象分代?
堆中绝大多少“朝生夕灭” (程序执行完一般都要回收)。
出于性能的考虑,按照年龄(age)按区域进行划分,缩小内存扫描的范围。
针对不同特性的对象,采用不同的垃圾回收,最大程度的提高执行效率。