三种主流的JVM(JDK)使用心得

文章源地址:http://blog.csdn.net/chenyi8888/article/details/4722410


目前市面上就只有三种主流的JVM:SUN、BEA和IBM。

我对三种主流的JVM的都有过使用,并运用到实际的项目当中,来谈谈使用它们的感受。

 

首先来谈谈SUN的JVM

这个JVM是大家在开发过程中普遍用的比较多的一个,我的开发过程中也是用它居多,总体感觉一般,没有比较特别的地方。因为一个是其GC回收机制,一个是其本身的BUG问题。先来说下BUG问题,我是在06年底,就采用了JDK1.5的版本来进行项目开发,当时使用的版本是JDK1.5_06。这个版本中的线程1.5就有一个非常严重的BUG,它将导致服务器内存泄漏(关于这个问题,SUN官方网站也有提到。而且也有其他人在其博客上也对这个问题进行详细的描述,在此就不细说了)。当时为了解决这个问题花了一个多礼拜的时间,而后续的JDK几个版本(2个版本还是3个,记得不是很清楚)还没有进行修正,最后只能变相的使用线程1.5的技术了。

早期的JDK1.5的版本在运行时很不稳定。我就碰到服务器经常运行3、4天,就莫名其妙的关掉了(也就是进程杀掉了),当时日志没有任何异常信息,就是在当前目录下生成一个java_error_pid.log形式的文件(pid表示linux下的进程号)。最后就只好升级JDK的版本,然后问题得到了解决,以后服务器也不当机了。

还有就是早期的JDK1.5在兼容性方面也存在问题,如JDK1.4的jar包不能直接运行在JDK1.5上,没有达到向前兼容的目的。

不过这些问题在最终的JDK1.5.0_17上都得到了解决。

 

关于GC回收,SUN的JVM的GC回收由两个部分组成,一个是频繁GC,一个是Full GC。

为了让SUM的JVM运行在更强劲,需要对其配置复杂的参数设置(可参考本人转载一篇《JVM参数调优》,该文章里的内容我都亲自测试过,能让JVM有一个明显性能提升)。

如何通过GC信息来判断程序是否合理,主要是两种方式:一种是通过工具的形式(如jprofiler等工具),一种就是查看GC的日志(关于如何配置GC日志参数,网上有很多资料)。工具判断非常方便只有那个GC图里没有大起大落就行,就是那根线比较平缓。这里主要是介绍下如何通过GC日志来判断(只是个人的经验之谈,可作为参考)。


关于频繁的GC日志信息如下:
10.719: [GC 46136K->17722K(517056K), 0.3663676 secs] 
11.239: [GC 39136K->18586K(517056K), 0.0045660 secs]

 

关于FULL GC的日志信息如下:
16.276: [Full GC 516871K->3239K(517056K), 0.0547627 secs] 
19.173: [Full GC 517056K->4240K(517056K), 1.0565893 secs]

SUN的JVM慢其中有一个原因就是频繁GC和FULL GC运行频率高导致,这样会占用系统很多资源。那么如何判断程序运行是否健康呢?
对于频繁GC而言
第一:判断回收量,就是回收前减去回收后的值就是回收量,一般对于单核而言(至少2GB内存)这个回收量保持在8MB至25MB之间比较正常。对于多核而言(我只测试过8核的,4GB内存)回收量保持在20MB至50MB之间比较正常。
第二:判断回收一次的时间。这里是以小数点为标准,一般不管是单核还是多核,小数点右边至少出现2个0,算是比较正常的(如频繁GC信息第二行内容,如果出现第一行的内容,说明程序运行有点问题),而小数点左边一般都是0(如果不是0,只能说明程序有严重的问题)。
对于FULL GC而言
第一:还是判断回收量,不同的是回收量的数字会加大很多而且也和你的JVM最大内存数有关(这里假设最大内存数为512MB),单核(至少2GB内存)一次FULL GC将要回收200MB至350MB算比较正常。多核(8核,4GB内存)下回收量也差不多。第二:还是回收一次的时间,单核下一次FULL GC最好控制在1秒到3秒之间。多核下一次FULL GC最好控制在0秒到1.5秒之间。
再次提醒这些数据只是个参考思路,可能机器配置更强劲,处理的速度会更快吧。还有就是导致程序内存泄露有很多情况,处理的方式也很复杂。到时候我会专门讲一下关于java程序如何避免内存泄露。


那如何提高编写程序的效率呢?其实答案很简单,就是减少FULL GC的次数,如40多分钟一次FULL GC,更好的话就是加大频繁GC一次的回收量。如果是计算机专业的人应该还知道,想提高效率的其他方式就是必须学好数据结构、算法分析和编译原理(这是一个漫长的过程,需要大量的时间进行实践,才能有更深刻的感受)。

 

接着再谈谈BEA的JVM
它的JVM算是三种当中比较有特点的JVM,性能最强。而且它对线程和网络都做了大量的优化和技巧的工作。我曾经在同一个服务器上使用了SUN和BEA的JVM,分别在单核上进行了的测试(2GB内存),发现BEA的JVM处理量是SUN的JVM的一倍多,在相同的时间内(15天的时间),前者是300百多万的处理量,而后者只有150百万的处理量。


说下它的GC机制,它跟SUN的GC机制有很大不同,其中之一就是没有FULL GC和频繁GC的概念,而且每次GC操作间隔时间较长,回收量也是大小不等,从一次回收几十MB,到有时候一次回收上百MB。其二是使用BEA的JVM启动速度较快。其三参数的设置相对于SUN的设置来说,算是比较简单的(大家可以到网上搜索这方面的资料)。


最后来谈谈IBM的JVM

对于它的JVM实在一次偶然的机会,公司为客户做一个项目时,客户所使用的是IBM整套的解决方案,自然也就使用IBM的自己的JVM了。当时在开发过程中,有点想当然,认为反正java跨平台,所以就没有基于一个IBM的平台上做开发,项目提交后,客户那边也运行很正常没有出现什么大的毛病,过了几天,对方的工程师就打电话过来告诉我们日志信息里有大量的错误信息。要求我们查明,最好花了两天时间检查下来发现,目前IBM的JVM并不支持JDK1.5后的新特性(这里是不支持java NIO里的相关技术),所以只好重新修改代码才把问题解决。

 

总结说明下:
对于一般的应用而言,建议采用SUN的JVM就足够了;对于对性能要求很高的应用而言,建议采用BEA的JVM,如java版的游戏服务器;对于有钱的公司而言,建议采用IBM的JVM,那是一整套解决方案,后期维护方便(只是开发过程中要注意兼容性的问题,听说IBM的JVM现在更新很慢,所以不一定符合新的java标准)。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JVM(Java虚拟机)是Java程序运行的环境,它是一个能够执行Java字节码的虚拟机。JVM将Java字节码翻译成可被物理机器执行的指令,同时还提供了内存管理、垃圾回收、安全机制等功能,使得Java程序在不同的操作系统上能够运行。 JDK(Java开发工具包)是Java开发的基础工具集合,它提供了编写、编译、调试和运行Java程序的工具。JDK包括了JRE和开发工具,如编译器(javac)、调试器(jdb)、自动构建工具(Ant/Maven/Gradle)等。通过JDK,开发者可以创建和开发Java应用程序。 JRE(Java运行环境)是Java应用程序运行所需的核心组件集合,包括JVM和一些基础类库。JRE只能用于运行Java程序,而不能用于开发Java程序。当一个Java程序被编译完成后,它就能在安装了JRE的机器上运行。 总结来说,JVM是Java程序运行的环境,JDK是用于开发Java程序的工具集合,而JRE是运行Java程序所必需的核心组件集合。 ### 回答2: JVM(Java虚拟机)是Java编程语言的核心组件之一。它是一种虚拟计算机,可以在各种操作系统上运行Java字节码。JVM负责将Java源代码编译成可执行的字节码,并提供了内存管理、垃圾回收、安全性和线程同步等功能。JVM不只是一个程序,它是一种执行环境,可以运行Java程序。 JDK(Java开发工具包)是Java应用程序开发的软件包。它包含了JVM和其他用于开发Java应用程序的工具,如编译器(javac)、调试器(jdb)和执行器(java)。JDK是Java开发者所需的基本工具,它提供了编译、运行和调试Java程序的功能,以及许多其他开发所需的库和工具。 JRE(Java运行时环境)是JVM的一种实现,提供了执行Java字节码的运行环境。它包含了JVM、运行时类库和其他支持组件,可以让用户在计算机上运行已编译的Java程序。JRE只能运行Java程序,而无法进行Java应用程序的开发。 简而言之,JVM是Java程序的执行环境,JDK是开发Java程序所需的工具包,JRE是运行已编译的Java程序的环境。在开发Java应用程序时,需要安装JDK来编写、编译和调试代码;而在用户计算机上运行Java程序时,只需要安装JRE即可。 ### 回答3: JVM(Java Virtual Machine)是Java虚拟机的缩写,是Java程序运行的基础。它是一个执行Java字节码的虚拟计算机,负责解释和执行Java程序。JVM是跨平台的关键,因为Java程序可以在不同操作系统上运行,只需要安装对应的JVM即可。JVM还负责垃圾回收、内存管理等任务,使得Java程序具有自动内存管理的优势。 JDK(Java Development Kit)是Java开发工具包的缩写,它是开发Java应用程序的必备工具。JDK提供了Java编译器(javac)用于将Java源代码编译成字节码,还提供了用于调试和运行Java程序的工具。JDK中还包括了丰富的Java类库,开发者可以利用这些类库快速构建Java应用程序。 JRE(Java Runtime Environment)是Java运行时环境的缩写,它提供了Java程序运行所需的所有运行时环境。JRE包含了JVM和一些必要的类库,用于解释和执行Java字节码。当用户想要运行Java程序时,只需要在自己的计算机上安装JRE即可,而无需安装整个JDK。 总结起来,JVM是Java程序的运行平台,负责解释和执行Java字节码;JDK是Java开发工具包,用于开发Java应用程序,并包含了编译器和一些开发工具;JRE是Java运行时环境,包含了JVM和一些必要的类库,用于运行Java程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值