java虚拟机之HotSpot

来源:互联网 发布:java set contains 编辑:程序博客网 时间:2024/05/16 05:41
一、HotSpot简介
  HotSpot是sun公司从版本java1.3开始使用的默认虚拟机,Oracle公司的java1.7使用的也是HotSpot虚拟机。不同厂商之间的java虚拟机是不同的,但是它们都遵守java虚拟机规范。
二、JIT简介
  JIT的全名是Just-in-time,即时编译的意思。java程序编译成class文件,加载到内存后成为字节码。jvm在执行字节码时,采用的是即时编译。虚拟机在运行过程中,将字节码指令解析成操作系统原生指令。那么怎么来提高这个解析效率呢,下面提供了两种优化策略。
三、HotSpot的优化措施
1、热点方式
(1)热点:程序运行的时候遵循一个局部性原理,即程序运行中小部分的代码执行时间比较长。这少部分的代码称为热点。
(2)二八原理:即20%的代码占用80%的时间。
(3)优化思路:在Hotspot启动后会分析程序的字节代码,找出热点,并对热点进行复杂的优化工作。随着程序的运行,其中
的热点会发生改变,虚拟机会监视程序的运行状态,以追踪其中的热点。
(4)好处:不需要对程序中所有程序进行复杂的优化,减少了代码优化的工作。
2、内联方式
(1)java方法内联:在C++里面是否内联由自己决定,而java里面的内联由编译器决定。当对象申明成final后,编译器会考虑
是否让该函数成为内联函数。内联方法可以减少方法的调用,从而提高程序的性能。
(2)思路:java虚拟机允许时的大部分时间花销在方法调用上。所以可以采用方法内联的方式进行虚拟机优化。
(3)好处:方法内联减少了方法的调用。
四、分代技术
1、年轻代
  大部分对象的内存是在年轻代分配的。年轻代区域分为新生区和2个存活区(为了方便后面描述,分别设置为A和B,B区域为空)。
2、年老代
  如果对象存在的时间比较长,就会复制到年老区域。当对象太大无法在年轻代区域进行分配时,会在年老代区域进行内存分配。
3、永久代
  永久代区域存储的是虚拟机自身运行的对象。
五、分代回收
1、年轻代回收的步骤:
(1)第一步:新生区中的数据先复制到一个空白存活区域B
(2)第二步:处理另外一个存活区域A进行数据复制,如果对象存活时间较短,则复制数据到存活区域B,如果存活时间长或者存活区域B已经满了,则复制到年老区。
(3)第三步:把新生区和存活区A中的数据清除掉。
  完成垃圾回收之后,内存分配继续从新生区开始,两个存活区发生作用。
2、年老代和永久代的回收步骤:
  年老代的回收常常采用标志-清除-压缩算法(标志追踪法)进行回收。其思想是基于有向图的查找算法,查找图中不可达的
对象进行回收,这种方法可以解决回收时的孤岛问题(采用引用计算器时可能出现)。
(1)第一步:标志。扫描整个内存区域,把当前存活的对象标志出来。
(2)第二步:清除。清理不可达的对象的内存。
(3)第三步:压缩。把存活对象的内存区域移到内存区域的起始位置,使内存中的区域是连续的。这样压缩内存之后,在年老代
或者永久代进行内存分配时变得很容易,只需从区域的开头位置进行分配即可。
六、垃圾回收算法的选择
  HotSpot会根据硬件平台选择最合适的垃圾回收算法。回收算法的选择需要考虑较多的因素,如cpu的个数、服务器和非服务器等等。对于服务器采用并行回收算法,非服务器采用串行回收。
0 0
原创粉丝点击