您的位置:首页 > 其它

【技术术语】Sun HotSpot VM

2016-08-22 17:13 375 查看

Java HotSpot VM 简介

Java HotSpot 虚拟机(VM)是 Java 2 Platform, Standard Edition (J2SE)软件的一项核心技术,并且广泛的被一些「整合开发环境(IDEs)」还有「Application Server」所使用,包括有 Forte for Java 、Borland JBuilder 、WebGain VisualCafe 、Oracle JDeveloper 、Metrowerks CodeWarrior
、NetBeansTM Open Source Projec t 、BEA Systems (WebLogic Server) 还有 iPlanet (iPlanetTM Application Server) 等等。与之前的版本比较起来,Java HotSpot虚拟机在效能方面加强了许多,特别是在 garbage collection 还有 thread 的处理方面。此外,Java HotSpot虚拟机可以透过「client」或是「server」这两个字来决定是要使用 Java HotSpot Client
VM 或是 Java HotSpot Server VM 来将应用程序作最佳效能的处理。

在 Java 2 SDK, Standard Edition v1.3.1 当中,Java HotSpot VM 包含了许许多多新的效能提升技术,最主要增加的地方有以下几点:
1.在运行时间(Runtime)方面
当致命的错误在虚拟机当中发生,不论是在 VM 当中引起的,或是由使用者使用的 native code ,都会有较佳的回报功能。

Java Virtual Machine Debugger Interface (JVMDI)和 Java Virtual Machine Profiler Interface (JVMPT)的特性现在完全支持了。

在这个版本的 VM 是由一致性的原始码所建构出来的,方便移植到所有支持的平台。
2.在 Garbage Collection 方面
Garbage collector 现在已经可以完全使用 32-bit 系统中的地址空间了,这表示可以存取 4g 大小的 heap了。不过在这边要注意的是,并不是所有的作业环境都支持这么大的 heap ,SolarisTM 的话有支持。

Garbage collector 已经调整用来支持大型应用程序和 UltraSPARCTM III 平台。
3.在 Java HotSpot Client VM 方面
确保 VM 的特性可以横跨所支持的平台。
4.在 Java HotSpot Server VM 优化方面
Java 在对于每个数组的存取,都会去检查有无超过边界。但若是编译程序已经确定数组存取是在范围之内的话,那么就可以把这项检查消除掉。

Server VM 现在新增加了 loop unrolling 这项特性,可以用来加快循环的执行。

对于 UltraSPARC III 的优化增加了 instruction scheduling 的功能。

对 Java reflection API 做面向对象的优化处理。

Java HotSpot VM 的架构

对于 Java HotSpot VM 它的架构,在这边我们分成下面几个方向来介绍说明:
1.内存模型(memory model)方面
在 以往先前的 Java 虚拟机当中,是使用间接处理的方式来处理对象之间的参考。这使的我们在 garbage collection的时候要 relocate 对象会变的比较容易,不过,这却也变成是效能的瓶颈所在。因为当我们要存取所实作出来对象当中的变量的话,要经过两层的步骤。

新 一代的 Java HotSpot VM 对于对象之间的参考,就直接实作成了指标,所以我们可以就像是用 C 的访问速度来存取我们实作出来的变量。而 garbage collector 就是当对象在内存当中被 relocate 的时候,我们为了要找出或是更新在同一块区域当中,所有同样参考到这个对象所设计出来的。

除此之外,新的 Java HotSpot VM 也使用了有两个机器字符的文件头(machine-word object header)来取代之前所采用的三个,这表示我们对于每个应用程序可以节省掉将进 8% 的 heap 大小。在这边,第一个 header 包含了例如 hash code 或是 garbage collector 状态的讯息,第二个 header 则是表示参考到哪个对象类别,只有当我们使用数组的时候才会出现第三个 header 字段-是用来表示数组大小的。
2.Garbage Collection 方面
对 于程序设计者来说,使用 Java 作为其程序开发语言其中有个重要的因素是,它提供了自动的内存管理(或称之为garbage collection)。在传统的程序语言上,我们要动态的配置内存空间的话,需要由我们自己设定。但在实际上,这也容易造成程序经常内存使用不足, 或是易造成 crash 。

当新一代的 garbage collector 在确定并且证明某个对象已经不会在这个程序当中被使用到了,那么,它会在背景自动处理释放这些已经没有在使用的对象所占的内存。

在传统上,garbage collection 经常会带给大家这是个没有效率的处理,或是程序效能低落的瓶颈所在。但是在新一代的 garbage collection 技术当中,会自动的考虑到整体的效能,并且对于内存释放有更好的处理。
3.Thread Synchronization 方面
在 过去 Java 在同步化的实作上,会相当的没有效率是因为跟其他在 Java 当中的操作运算有关,同时也是效能的瓶颈所在的主要原因之一。新一代的 Java HotSpot VM 在 thread 的实作上面有重大的突破,包含提高同步效能这个项目。此外,Java HotSpot VM 对于 thread 处理提供了线性执行还有有加速的能力,并且设计能够在拥有大量共享内存的多处理器服务器上能够立刻变化扩充加速处理的能力。

_______________________________________

上次为大家简单介绍了 Java 2 SDK, Standard Edition v1.3.1 当中,Java HotSpot VM 的一些新的特性和它的架构,这次将跟大家继续介绍 Java HotSpot VM 和其编译程序(compiler)部份。
相 信在大家安装完 Java 2 SDK, Standard Edition v1.3.1 之后,若您的操作系统是 Windows 的话,会在 C:/ 安装 jdk 的目录/jre/bin 下发现有三个目录,分别为「classic」、「hotspot」和「server」这三个。若是您在提示符号下执行 java.exe 程序的话,后面接上 -version 的参数,则可分别看到类似下面的讯息:

C:/jdk/jre/bin>java -version

java version "1.3.1"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1-b24)
Java HotSpot(TM) Client VM (build 1.3.1-b24, mixed mode)

C:/jdk/jre/bin>

C:/jdk/jre/bin>java -server -version

java version "1.3.1"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1-b24)
Java HotSpot(TM) Server VM (build 1.3.1-b24, mixed mode)

C:/jdk/jre/bin>

C:/jdk/jre/bin>java -classic -version

java version "1.3.1"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1-b24)
Classic VM (build 1.3.1-b24, native threads, nojit)

C:/jdk/jre/bin>

另外,若是使用 -X 的参数的话,也可以看到明显的不同:

C:/>java -server -X
-Xmixed mixed mode execution (default)

-Xint interpreted mode execution only
 

-Xbootclasspath:<directories and zip/jar files separated by ;>

set search path for bootstrap classes and resources

-Xbootclasspath/a:<directories and zip/jar files separated by ;>

append to end of bootstrap class path

-Xbootclasspath/p:<directories and zip/jar files separated by ;>

prepend in front of bootstrap class path

-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection

-Xbatch disable background compilation
 

-Xms<size> set initial Java heap size

-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size

-Xprof output cpu profiling data
 

-Xrunhprof[:help]|[:<option>=<value>, ...]

perform JVMPI heap, cpu, or monitor profiling

-Xdebug enable remote debugging

-Xfuture enable strictest checks, anticipating future default

-Xrs reduce use of OS signals by Java/VM (see documentation)

The -X options are non-standard and subject to changewithout notice.

C:/>

C:/>java -classic -X

-Xbootclasspath:<directories and zip/jar files separated by ;>

set search path for bootstrap classes and resources

-Xbootclasspath/a:<directories and zip/jar files separated by ;>

append to end of bootstrap class path

-Xbootclasspath/p:<directories and zip/jar files separated by ;>

prepend in front of bootstrap class path

-Xnoclassgc disable class garbage collection

-Xms<size> set initial Java heap size

-Xmx<size> set maximum Java heap size

-Xrs reduce the use of OS signals
-Xcheck:jni perform additional checks for JNI functions

-Xcheck:nabounds perform additional checks for JNI array operations
 

-Xrunhprof[:help]|[:<option>=<value>, ...]

perform heap, cpu, or monitor profiling

-Xdebug enable remote debugging

-Xfuture enable strictest checks, anticipating future default

The -X options are non-standard and subject to change without notice.

C:>

从上面的讯息我们可以看到,除了传统的 Classic VM 之外,Java HotSpot VM 还分成了 Client VM 和 Server VM 。其实,不管是client 还是 server 的 VM ,都共享了 Java HotSpot 执行环境的基本程序,但是它们使用了不同的编译程序来让 client 或是 server端执行环境的效能特性能够彰显出来。对于 server VM 来说,它会特别将程序的操作速度微调至最好的部份,所以用来执行 server端的应用程序的话,可以拥有较快的启动时间还有当应用程序在执行的时候,会占据较少的内存空间。另外,对于
client VM 来说,它主要增进的效能是在于 client 端的应用程序,或是 applet 部份。Java HotSpot Client VM 会特别调整应用程序的启动速度和内存使用空间,让它对于我们在 client 的环境可以「非常速配」。一般来说,若是 client 端系统有 GUI 接口的话,会有比较好的成效。

在编译程序方面的话,client VM 的编译程序并不会去执行类似像是 server VM 那样复杂的优化技术,所以它会花较少的时间在分析和编译 code 上面。从另一个观点来看,就是它在启动时间会增快,并且耗费较少的内存空间。另外,client VM 在编译的过程可以分为两个阶段来描述,第一个部份是各平台独立的分析 bytecode ,第二部份的话,则是根据各个平台不同来产生机器码。相对的在server VM 方面,它使用了更强的「具有可调变能力的编译程序」,这比传统的静态的编译器具有更多的优点与特性。

 

结语

Java HotSpot VM 在程序方面做了更强的优化处理,另外,在 garbage collection 还有 thread 同步方面也做了相当大的改进。除此之外,Java HotSpot VM 对于 client 和 server 端的应用程序,分别提供了不同的执行环境,使的应用程序在执行的时候,可以获得最好的效果。若是大家对于 Java HotSpot VM 有兴趣的话,可以到 http://java.sun.com/products/hotspot/index.html 这边获得更多的相关资料。

看看你下面的这两个文件,是不是尺寸差别很大? 

%JAVA_HOME%/jre/bin/client/jvm.dll 

%JAVA_HOME%/jre/bin/server/jvm.dll 

Jvm 动态库有 client 和 server 两个版本,分别针对桌面应用和服务器应用做了相应的优化, client 版本加 载速度较快, server 版本加载速度较慢但运行起来较快。 

让 Tomcat 使用 Server 版本的 jvm 吧   在开始菜单 tomcat5 ->tomcat config 的 java 属性中 有一项 jvm 路径 指向 server 目录下的 jvm 就行了。 

启动速度对比一下,在我的 C4.17 512M 的机器上 client 版本一般在 8s-16s 内启动完成 server 版本 在 21s-26s 左右启动完成。 

更改默认 java.exe 调用的 jvm.dll, 这个由 jvm.cfg 决定。 

编辑 %JAVA_HOME%/jre/lib/i386/jvm.cfg  

里面第一行写的是 -client 默认就是 client 版本 ,把第二行的 -server KNOWN 放到第一行, 如下面所示 

-server KNOWN 

-client KNOWN 

-hotspot ALIASED_TO -client 

-classic WARN 

-native ERROR 

-green ERROR 

改完保存,然后看看默认版本: 

C:/java -version 

java version "1.4.2_07" 

Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-b05) 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: