Sun 公司的JVM,其垃圾回收机制主要采用“分代”方式进行,他将JVM堆栈分为3部分:年轻代、年老代以及持久代。SUN的JVM通过不同的收集器实现不同的收集算法,主要有以下:
1、复制收集器(Copying Collector)
2、标记-清除收集器(Mark and Sweep Collector)
3、标记-整理收集器(Mark and Compact Collector)
Sun 公司的JVM使用频率还是蛮高的,其主要特点无非就是以下几点:
1、 GC机制
2、 自身的缺陷问题
关于GC,SUN公司JVM GC主要由2部分组成,其一是“频繁”GC,其二是“Full”GC。
某些情况下,为了让JVM运行更加强劲,我们需对其复杂配置的参数进行设置,从而满足系统业务要求。
针对如何判断程序运行是否正确,我们可以通过以下途径:
1、 通过工具监控,例如:Jprofiler、Jconsole以及JDK 6以上版本自带的工具JVisualvm等。
2、 通过查看日志,例如:
关于频繁的GC日志信息如下:
10.719: [GC 46136K->17722K(517056K), 0.3663676 secs]
关于FULL GC的日志信息如下: 16.276: [Full GC 516871K->3239K(517056K), 0.0547627 secs]
SUN的JVM慢其中有一个原因就是频繁GC和FULL GC运行频率高,这样就导致
占用系统很多资源。
生成HeapDump文件参数配置如下:
HeapDumpOnOutOfMemoryError 参数(此参数需要Java SE release 5.0 update 14 或以上支持)
设置示例: set JAVA_OPTS=%JAVA_OPTS% -server -Xms512m -Xmx800m -XX:PermSize=64M -XX:MaxPermSize=128m -Djava.awt.headless=true -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpOnCtrlBreak
针对Oracle JVM,以前是BEA JVM,后来被Oracle收购,谈起Oracle JVM,其GC机制与SUN公司截然不同,主要有以下特点:
1、 没有FULL GC和频繁GC的概念,每次GC操作间隔时间较长,且回收量也是大小不等。
2、 使用BEA 的JVM启动速度较快
3、 参数设置较为简单
相对其他JVM来说,其性能最强,基于此基础上对线程和网络都做了大量的优化和技巧的工作。
基于Bea JRockit JVM及SUN JVM,目前Oracle JVM支持一下4中垃圾收集器:
1、 分代复制
2、 单空间并发
3、 分代并发
4、 并行收集
生成HeapDump文件配置和SUN JVM一致。
和其他JVM不同,IBM JVM有自己的特色,与SUN JVM分代回收策略不同的是,其GC主要分3步走:Mark phase(标记),Sweep phase(清扫),Compaction phase(内存紧缩)。
其与SUN JVM基本兼容,主要用于WebSphere应用上,跑在AIX的中间件服务器上,默认为完整的方案解决。目前不支持较高的JDK版本。
IBM JDK生成HeapDump文件参数配置如下: — export IBM_HEAPDUMP=true — export IBM_HEAP_DUMP=true — export IBM_HEAPDUMP_OUTOFMEMORY=true — export IBM_JAVADUMP_OUTOFMEMORY=true — export IBM_JAVACORE_OUTOFMEMORY=true — export IBM_HEAPDUMPDIR=<directory_path>
与SUN JVM基本兼容,有其自己独特地启动参数配置,主要运行在HP UNIX平台上,HP JVM主要分PA和IA平台。
HP JDK生成HeapDump文件需在环境变量加:
export_JAVA_HEAPDUMP=1