java性能优化 (0分)

  • 主题发起人 主题发起人 小猪
  • 开始时间 开始时间

小猪

Unregistered / Unconfirmed
GUEST, unregistred user!
Java虚拟机(JVM)的性能优化
??Java体系结构由四个不同却又相互关联的部分组成:语言本身、class文件格式、Java API 库和JVM。当执行一个Java程序时,源代码是用Java 语言写成,它被编译成class文件格式,运行在JVM中。同时,Java程序调用Java API 库的方法,访问系统资源。JVM 和 Java API 库形成了编译和运行环境,就叫做Java平台。JVM是基于堆栈的(stack-based),而不象汇编语言是基于寄存器的(register based)。JVM是一个动态堆栈基础上的抽象的计算机体系结构,提供了push、pop来操作数据。JVM的主要功能是装载class文件,执行字节码。java平台的执行工作量分为四个部分:
1. 字节码的执行:JVM花费大概一半的时间来解释字节码。
2. Garbage collection(垃圾回收)
3. 线程管理
4. 动态操作:类装载、绑定检查、安全检查、动态类装载、异常捕获、反射机制、本地方法的翻译。
其中,对象的垃圾回收会占用运行时间,造成程序的短暂中断。
使用HotSpot
HotSpot JVM作为java 2 SDK 的一个附加模块,使用了state-of-the-art 技术大大的提高了系统性能:
1. 适应编译:HotSpot JVM会在程序的运行过程中分析性能的瓶颈("hot spots"),然后编译这些和性能提高最紧密的部分。
2. 改善的Garbage collection
3. 线程同步优化
??HotSpot JVM使用两个机器字(two-machine-word) 作为对象的header,而不象大多数JVM使用三个机器字,这样大约可以节省10%的堆内存空间,加速了对所有对象的扫描。
HotSpot JVM 也丢弃了 handle 的概念,对象引用的实现是通过直接指针,减少了内存的使用和提高了处理速度。访问实例变量象C 语言一样的高效。
可以去http://java.sun.com/products/hotspot/2.0/download.html 下载Java HotSpotTM Server VM 2.0,执行安装即可。如果需要可以针对 jdk 和 jre分别进行安装。
HotSpot JVM 分为 client 和 server 版本,分别针对典型的客户端应用程序和服务器端应用进行了优化。Jdk1.3安装后就包含了 Java HotSpot Client VM,上面安装的是Java HotSpot Server VM。
可以通过命令行参数选择要使用的JVM:
· java -server :Java HotSpot Server VM
· java -hotspot : Java HotSpot Client VM
· java -classic : Java 2 Classic VM
缺省情况是使用 HotSpot Client VM。可以用 java -server -version 来查看版本信息,确定是否以正确安装。
只要针对不同的应用,选择Client 或Server HotSpot VM。对于Server-side应用,有时性能会提高20%,只要简单的在命令行启动Server 时加上 -server 。
Garbage Collection
HotSpot JVM 提供了三种类型的垃圾回收算法,分别是:
1. Copy/scavenge collection
2. Mark-compact collection
3. Incremental (train) collection
具体的含义我不解释了,有兴趣可以查看相关的文档。
一个 JVM 的吞吐量是指除去 GC 消耗的时间占总执行时间的百分比。因此,80%的吞度量就是说 GC 消耗了20%的 JVM 处理时间。当你的应用程序运行时,JVM 的 GC 会造成程序的暂停。
堆内存被分成了 new 和 old 两部分,如下图:
|Perm| old |ss#1|ss#2| new |
|64MB|<-----------old------------>|<------new-------->|
|JVM |<---------------------程序使用------------------>|
|<-------------------------堆内存空间----------------->|

new 部分包括新创建对象区和两个 survivor 区(SS#1和SS#2),新创建的对象分配内存在 new 中,长时间存活的对象被移动到了 old 部分。Perm 是一个永久区域,分配给JVM本省,可以通过 命令行参数 -XX:MaxPermSize=64m 来设置。
当 new 被填满后,会触发"辅助" GC,把存在足够长时间的对象移动到 old 中。当 old 中也被填满了,会触发"主" GC ,将遍历堆内存中的所有对象。可以看出,"主" GC 会消耗更多的时间。足够大的 new 会适合需要大量创建存在时间很短的对象,而 old 如果不够大会频繁的触发"主" GC ,大大降低了性能。所以,我们的任务就是如何设置堆内存的大小以及如何规划 new 和 old 区域的比例来适合我们应用。
"辅助" GC 使用Copy/scavenge collection 算法,"主"GC 使用 Mark-compact collection。
Heap分配策略
通过命令行参数,我们可以设置堆的大小和分配"new"、"old"的比例。一些常用参数如下:
-Xms<size> 设置java堆内存的初始大小
-Xmx<size> 设置java堆内存的最大值
-XX:NewSize=<size> 设置"new"的初始大小
-XX:MaxNewSize=<size> 设置"new"的最大值
-XX:NewRatio=2 设置"old"和"new"的比率
-XX:SurvivorRation=64 设置"ss#1"和"new"的比率
-XX:MaxPermSize=64M 设置不可变区域
详细的参数设置请参看相关的文档。
如何来规划我们的堆内存分配策略呢?没有一个明确详细的规定,只能根据我们具体的应用进行调节,使性能达到最优化。这种优化方法不需要程序员改变代码,但有时效果会很明显。下面总结了一些操作建议:
· 如果GC成为了瓶颈,请定制你的堆内存分配
· 分配尽可能多的内存给JVM。但如果过多,会引起内存和硬盘之间的交换,反而降低的性能。你可以分配80%的可用RAM 给JVM。
· 如果是Server-Side应用,请加 -server参数。这样,缺省的NewRatio 是2,SurvivorRatio 是 25 ,适合大部分应用。也可以用NewSize、MaxNewSize来设置。
· 设置- Xms 和 -Xmx 的大小相等,可以避免在每次 GC 后调整堆内存的大小。
· 同样道理设置NewSize、MaxNewSize相等。
· "new"的大小最好不要大于"old"的一半。
 
曹晓钢如是说:
参见Inside java VM 第9章:垃圾收集
嘿嘿。
书上说HotSpot用的是train也就是火车算法。
其实是这样的:现代的GC采用的是按照年龄层划分的GC策略。并非所有的对象都是放到一个大的new或者old堆中去,也就是说堆不仅仅是分为new/old两部分,而是按照年龄层划分多个。
比如说,划分为0-10岁年龄层,10-20岁年龄层,20岁-60岁年龄层和>60岁的老年层。
类实例刚刚创建的时候,进入0-10岁年龄层。在年龄层内部,堆区域被划分成两部分:new /old. 每当new满了,就copy仍然存活的实例到old去。就是你上面所说的那种收集。当一个实例经历了10此收集仍然存活,就认为他活过了10岁,转移到10~20岁年龄层。如此这般,直到>60岁的年龄层中。
火车算法是专用来管理老年年龄层的。老年层不区分new/old,他把所有的老年对象都放在固定大小的车厢中,车厢被连接到火车中,然后每次垃圾收集的时候,以整个车厢为单位搜索引用。假若整节车厢或者整列火车都不再被引用,则整体引爆销毁。
由此可见,你上面说的三种方法
1. Copy/scavenge collection
2. Mark-compact collection
3. Incremental (train) collection
并非是三种不同的方法,而是同时采取的三种策略。
由此可见,你上文中列出的:Xms和Xmm之类的参数,可能是个总数。除了这个大略的总数之外,堆划分成几个年龄层,每个年龄层的跨度如何,都会直接影响性能。比如说,server可能某些固定的操作特别频繁,造成大量的小对象快速诞生也快速消亡,那么多划分几层年轻的年龄层可以保证每次收集都快速而有效,比如0-3岁年龄层,3-6岁,6-10岁。0-3岁收集最频繁,但是每次搜索的对象都很少。
所以,-server肯定不仅仅是影响几个ratio,内部的处理会有很大的不同的。
 
和曹晓钢的聊天记录:
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
关于jvm的参数调整
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
我知道得不比你多
(小猪)我已经被卖掉了,两毛钱一斤 说:
我从来没看到过有文档介绍那一堆参数,除了xms和xmx之外
(小猪)我已经被卖掉了,两毛钱一斤 说:
insidejvm里面有吗?
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
也没有
(小猪)我已经被卖掉了,两毛钱一斤 说:
我就真是奇怪了,那堆参数从哪儿钻出来的
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
参数是随着不同的jvm实现而不同的
(小猪)我已经被卖掉了,两毛钱一斤 说:
不对
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
而inside jvm这本书是讲的原理
(小猪)我已经被卖掉了,两毛钱一斤 说:
应该是相同的才对
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
java spec有一些参数
(小猪)我已经被卖掉了,两毛钱一斤 说:
可能需要去看看jdk规范才行了
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
比如-server什么的肯定不是规范之一
(小猪)我已经被卖掉了,两毛钱一斤 说:
http://java.sun.com/products/hotspot/2.0/README.html
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
Note -- The Java HotSpot Server VM 2.0 is an old release that remains available only for those who are still using J2SE 1.2.2 or J2SE 1.3.0. Recent releases of the J2SE platform, including versions 1.3.1 and later, ship with enhanced implementations of the Java HotSpot Server VM, and users of those J2SE platforms should notdo
wnload this the Java HotSpot Server VM 2.0.
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
fiant
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
原来是个过时的东东
(小猪)我已经被卖掉了,两毛钱一斤 说:
我怎么没看到这个?
(小猪)我已经被卖掉了,两毛钱一斤 说:
刚刚看了websphere
(小猪)我已经被卖掉了,两毛钱一斤 说:
已经自带了这个了
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
你这个搓人
(小猪)我已经被卖掉了,两毛钱一斤 说:
我的确没有看到啊
(小猪)我已经被卖掉了,两毛钱一斤 说:
还有,看看这个
http://java.sun.com/products/hotspot/
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
该去医院了!
(小猪)我已经被卖掉了,两毛钱一斤 说:
说不定是你是磋人也不一定的
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
这个没什么好看的
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
white paper而易啊
(小猪)我已经被卖掉了,两毛钱一斤 说:
嘿,你发给我的那个在哪儿啊?
(小猪)我已经被卖掉了,两毛钱一斤 说:
我死活找不到啊
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
我发给你什么了?
(小猪)我已经被卖掉了,两毛钱一斤 说:
就是那个Note后面的东东
(小猪)我已经被卖掉了,两毛钱一斤 说:
什么只对1。3有效之类的
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
http://java.sun.com/products/hotspot/2.0/download.html
(小猪)我已经被卖掉了,两毛钱一斤 说:
是不是我英语太差了
(小猪)我已经被卖掉了,两毛钱一斤 说:
我感觉它的意思是在后面的jdk版本已经包含了这个技术了,只是不需要单独安装而已嘛
(小猪)我已经被卖掉了,两毛钱一斤 说:
但那些参数还是跟这个有关的,这才是我关心的啊,呼呼。。。
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
no
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
http://java.sun.com/products/hotspot/2.0/download.html
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
C:/>java -version
java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)
C:/>
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
C:/>java -server
Error: no `server' JVM at `C:/Program Files/Java/j2re1.4.0/bin/server/jvm.dll'.
C:/>
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
jvm仍然保留-server的参数
(小猪)我已经被卖掉了,两毛钱一斤 说:

xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
应该是说新的server vm现在由于sun人力或者其他原因
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
还没开发出来
(小猪)我已经被卖掉了,两毛钱一斤 说:
# ./java -server -version
java version "1.3.1_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_05-b02)
Java HotSpot(TM) Server VM (build 1.3.1_05-b02, mixed mode)
(小猪)我已经被卖掉了,两毛钱一斤 说:
这是1。3。1哟
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
你还是1.3.1?
(小猪)我已经被卖掉了,两毛钱一斤 说:
是啊
(小猪)我已经被卖掉了,两毛钱一斤 说:
怎么了?
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
没啥...
(小猪)我已经被卖掉了,两毛钱一斤 说:
这是websphere4自带的jdk的版本说明
(小猪)我已经被卖掉了,两毛钱一斤 说:
应该是说可能针对1。4的hotspot还没有出来吧。
(小猪)我已经被卖掉了,两毛钱一斤 说:
1。3。1的肯定是没有问题了。我关心的还是那几个参数
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
hotspot出来了
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
但是server VM没有
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
hot spot是一个技术的名称而易啊
(小猪)我已经被卖掉了,两毛钱一斤 说:
恩,我说错了,是1。4的hotspot的server vm没有出来,ok?
(小猪)我已经被卖掉了,两毛钱一斤 说:
老是挑我的字眼
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
yes
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
现在总算说对了
(小猪)我已经被卖掉了,两毛钱一斤 说:
我准备拿个项目试试这几个参数,趁我辞职之前
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:

(小猪)我已经被卖掉了,两毛钱一斤 说:
所以我得赶紧的研究一下
(小猪)我已经被卖掉了,两毛钱一斤 说:
疯了,这么多
(小猪)我已经被卖掉了,两毛钱一斤 说:
http://java.sun.com/docs/hotspot/VMOptions.html
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
Xoptimize Use optimizing JIT Compiler -server
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
-Xoptimize等同于原来的-server
(小猪)我已经被卖掉了,两毛钱一斤 说:
怎么了
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
-Xincgc Use Train GC
-Xnoincgcdo
not use Train Garbage Collection (default)
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
原来默认是不使用train GC的
(小猪)我已经被卖掉了,两毛钱一斤 说:
嘻嘻,你可以在你的翻译中间加个译者注,又能骗点钱
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
-Xmn<Size> Set the size of the young generation (available begin
ning in J2SE 1.4.0)
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
你看,这个用来设置年轻一代的年龄层的大小
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
问题是怎么只有一个参数
(小猪)我已经被卖掉了,两毛钱一斤 说:
我看到了
(小猪)我已经被卖掉了,两毛钱一斤 说:
也许是这样
(小猪)我已经被卖掉了,两毛钱一斤 说:
设定这个参数,
(小猪)我已经被卖掉了,两毛钱一斤 说:
然后jvm根据这个参数按照确定的比例划分各个年龄层
(小猪)我已经被卖掉了,两毛钱一斤 说:
Prior to version 1.3.0, the production releases of the Java 2 SDK for Solaris shipped with a virtual-machine implementation known as the Exact VM (EVM). begin
ning with version 1.3.0, the Exact VM is replaced by the Java HotSpot VM.
(小猪)我已经被卖掉了,两毛钱一斤 说:
标准jdk还是不支持这些的
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
JVM只是一个规范
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
所谓的Exact VM或者HotSpot VM什么的
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
都是sun自己的技术
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
IBM/BEA都有自己的VM
(小猪)我已经被卖掉了,两毛钱一斤 说:
但是hotspot已经差不多成为一个规范了。刚才给你看的1。3是ibm的jdk
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
BEA的rocket VM就是专门用来对付server的
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/jrockit
(小猪)我已经被卖掉了,两毛钱一斤 说:
BEA WebLogic JRockit Java Virtual Machine delivers superior application performance, reliability, and manageability for mission-critical Java applications running on Intel platforms. Customers can now achieve ROI at all levels of the infrastructure stack.

(小猪)我已经被卖掉了,两毛钱一斤 说:
这是什么意思?只能在intel平台上用?
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
谁说的
(小猪)我已经被卖掉了,两毛钱一斤 说:
running on Intel platforms.
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
http://commerce.bea.com/showallversions.jsp?family=WLJR
(小猪)我已经被卖掉了,两毛钱一斤 说:
BEA WebLogic JRockit is a high-performing, reliable, and manageable Java Virtual Machine optimized for Intel 32 bit and 64 bit architectures that allows customers to dramatically reduce total costs across the entire infrastructure stack
(小猪)我已经被卖掉了,两毛钱一斤 说:
还是intel
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:

xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
可能
(小猪)我已经被卖掉了,两毛钱一斤 说:
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
下载的地方只有三个平台
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
windows (32bit)
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
linux (32bit)
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
linux( 64bit)
(小猪)我已经被卖掉了,两毛钱一斤 说:
呼呼
(小猪)我已经被卖掉了,两毛钱一斤 说:
所以还是要hotspot管用一点
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
http://www.spec.org/jAppServer2002/results/res2003q1/jAppServer2002-20030219-00007.html
xiaogang&amp;sup2;&amp;ordm;&amp;ordm;&amp;sup3;(鸭子终于上架了) 说:
BEA WebLogic 8.1, Advantage Edition Beta的测试结果
 
java 本来就慢,再怎么优化还是慢,
 
不能这样讲啊.
再慢你也得用,那你怎么办?不还得想办法让它快点么?[8D]
 
恩,JAVA是慢了点,但是比C++方便多了,没那么多难缠的摸版,蹩脚的写法!
 
java 垃圾收集的特点就是,
当你越需要它的时候,它对你越怠慢。
(怎么象是女人 HEHE)
java性能优化能做的就是 对象实例重用,开线程。
接下去的问题就是 多线程抢资源的问题。
 
最讨厌jdk的繁多的版本! 前两天一个客户来电话,说我的一个程序,在jdk1.3下面
运行良好,在jdk1.4下面不行。 我机器装的是1。3,于是到sun网站看看下一个1。4
下来,结果看到了如下的下载连接:
J2SE 1.4.2 Beta
J2SE 1.4.1
J2SE 1.4.0
J2SE 1.3.1
J2SE 1.2.2
JDK 1.1.x
我靠!一想到我要一个版本一个版本的安装测试就晕了!
这就是sun所吹嘘的“write once, run anywhere”!!!
 
接受答案了.
 
后退
顶部