JAVA虚拟机性能参数调优指导书

上传人:鲁** 文档编号:457672097 上传时间:2022-10-05 格式:DOC 页数:14 大小:110KB
返回 下载 相关 举报
JAVA虚拟机性能参数调优指导书_第1页
第1页 / 共14页
JAVA虚拟机性能参数调优指导书_第2页
第2页 / 共14页
JAVA虚拟机性能参数调优指导书_第3页
第3页 / 共14页
JAVA虚拟机性能参数调优指导书_第4页
第4页 / 共14页
JAVA虚拟机性能参数调优指导书_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《JAVA虚拟机性能参数调优指导书》由会员分享,可在线阅读,更多相关《JAVA虚拟机性能参数调优指导书(14页珍藏版)》请在金锄头文库上搜索。

1、.Java虚拟机性能参数调优指导书(仅供内部使用目 录1概述62JAVA虚拟机运行机制概览62.1运行时分析62.2垃圾收集和线程同步83JAVA虚拟机参数分类说明93.1Java虚拟机标准参数93.2Java虚拟机扩展参数114JAVA应用性能测试调优经历总结144.1GC调优参数的使用144.2JIT调优参数的使用154.3Java线程调优参数的使用155完毕语166参考文献16表目录表1 JVM 标准参数集11表2 JVM 扩展参数集11表3 JVM GC/Hotspot相关参数集13表4 JVM 性能统计参数集14Java虚拟机性能参数调优指导书 关键词:Java、垃圾收集、虚拟机、即

2、时编译摘要:随着JAVA在应用系统级的工程开发中的使用越来越广泛,虚拟机、垃圾收集、热点编译、J2EE等新技术层出不穷,JAVA作为系统级开发的一个选择的优势也越来越明显,在此同时其不能完全编译、垃圾收集等与生俱有的特征也使得JAVA备受争议的“慢得到更多的关注。本文通过对JAVA虚拟机的运行机理的分析,以及JAVA虚拟机参数使用说明等描述,试图使读者能够更好的运行他的基于JAVA的应用系统,以最小的代价换取最大的收益。缩略语清单:缩略语英文全名中文解释JAVASUN公司创造的一种语言JVMJava Virtual MachineJAVA虚拟机GCGarbage Collection垃圾收集H

3、otSpotJava虚拟机内部的一种热点编译技术JITJust-In-Time即时编译技术1 概述Java在大行其道的同时也在为自己与生俱来的缺陷不断的努力着,我们有理由相信Java的开发设计者们真是一群天才。构成Java技术的基石就是JVM的虚拟机技术,这时的Java已经不再是一门简单的语言,而是语言、开发包JDK与虚拟机的完美结合,而这里面的虚拟机那么是融合了编译技术、CPU技术的Java存在的根底所在。既然那么多的优秀的人为提升虚拟机性能做了那么多的工作,我们有什么理由不去充分利用这些珍贵的资源呢?本文就是试图从原理分析到参数应用上来帮助读者更大的发挥Java虚拟机的性能极限,使这样一个

4、优秀的产品更好地为我们效劳。2 JAVA虚拟机运行机制概览2.1 运行时分析首先让我们来看看所谓的Java虚拟机在运行起来后是什么样子的,从外面来看一个Java虚拟机的运行实例就是一个运行着的Java进程,Java进程在启动过程中做了如下工作,一、根据环境变量的设置或者Java进程的命令行参数将Java Class字节码加载到内存中,这样的Java字节码是Java虚拟机所能够识别的虚拟机指令的集合,Java虚拟机在解释执行字节指令的同时,根据某些代码的使用频率,将其中一局部字节码翻译成机器能够识别的二进制指令保存在内存中,在以后对这局部代码的调用,那么由Java虚拟机的代码控制CPU直接执行内

5、存中的这局部二进制指令,这个就是Java虚拟机的热点编译技术。而在早期的Java虚拟机实现中是采用全部字节程序解释执行的方式,后来开展了Java静态编译技术,这种技术是在Java程序编译成字节码后,由一个本地编译器将这些字节码编译成二进制可执行文件,这种编译技术不利于程序的移植。再后来开展的Java的动态编译技术,这时的编译过程是在Java装载字节码文件时进展的,而此时的问题是Java在启动时需要花费很长的时间来编译这些字节码。直到最后流行的Hotspot技术的出现,此时编译仅仅运行于少局部代码。按照80/20的原那么,程序的百分之80的时间仅仅运行其百分之20的代码,这样一个能够平衡启动时间

6、、移植性的中间方法解决了人们的大局部问题。之后,让我们看看Java虚拟机的内部体系构造,从下面的体系机构图来看,Java的Class字节码文件经由类加载子系统加载到内存中时,虚拟机根据文件内容将类的方法和数据加载到称为方法区的地方,堆是用来为运行时类实例提供存放场所的地方,这样的堆也称之为对象堆空间。而Java栈和PC计数器那么是为了Java线程而设计的,每一个Java线程一旦创立,它都将得到一个属于他自己的PC计数器程序计数器指针,类似于CPU中的IP指令指针计数器以及一个线程栈,在新版本Java Hotspot VM中是没有本地方法栈和线程栈之分的,只有一个线程栈的模块。这样每个线程的运行

7、都是在属于自己栈空间内的,而所有的线程那么共享着一个堆空间。当然在线程实现上不同的Java虚拟机的内部实现可能各有不同,有的自是直接将Java线程和操作系统内核线程绑定起来的,在虚拟机进程内部创立一个Java线程虚拟机就会请求操作系统为该一个进程创立一个内核线程,将线程之间的调度交给了操作系统内核来完成。而在早期的Java虚拟机一些实现中,Java线程对于操作系统来说是不可见,而是由应用层来完成线程调度,对于操作系统来说仅仅是一个单线程的进程。图1 Java虚拟机的内部体系构造Java虚拟机在运行时,由主线程开场解释执行类文件中的指令,主线程在自己的线程栈中存放临时变量、参数变量等,一旦碰到生

8、成新对象的new操作时,就会在堆空间内申请一块内存存放该类对象,而一旦程序从一个方法中退出后退回到一个方法栈的栈底,虚拟机程序并不会立即释放Heap空间内的这块内存,这就是与C/C+程序所不同的地方,因为C/C+程序被加载程序的操作系统调用装载到内存中之后,程序的内存是由操作系统为之分配的4G的虚拟内存空间,而堆空间的使用也是由程序的内存分配子系统malloc来完成的,而这个子系统仅仅是向程序员提供了申请/释放内存的调用接口,查看C/C+编译器生成的汇编代码你会发现,如果你在一个函数中申请了一块内存,而没有在函数退出的地方没有释放的话,这块内存那么会永远放在堆中,而对于你在函数中生明的类变量对

9、象来说非new来申请的指针对象,这个类对象的内存是在程序栈空间中分配的,一旦这个函数释放那么对象空间自动释放,这样的内存泄漏正是Java竭力防止的,Java从创造之初就是考虑着如何将大局部应用程序员从繁重的内存管理工作中解脱出来,而由Java虚拟机使用称之为GC垃圾收集的模块来完成内存空间的管理。Java虚拟机在启动时会根据-Xms的参数值向操作系统一次性申请一块内存空间作为自己的堆,而随着后续程序的运行中内存需求的增加,那么再向操作系统申请更多的内存加到自己的堆空间中。这个堆空间的最大值就是由-Xms指定的。一旦Java虚拟机发现应用程序申请的内存超过了堆内存的最大空间的话,Java就会抛出

10、一个超出堆空间的异常。而当虚拟机在启动时如果申请不到足够的内存的话,那么同样会抛出一个异常,启动失败。所有这些工作都是由Java虚拟机的内存管理模块来完成的,而Java的内存管理功能中最俱特色和重要的垃圾收集功能GC那么是按照下面机制运行的。2.2 垃圾收集和线程同步Java的垃圾收集器就像一个兢兢业业的仓库保管员,他管理着虚拟机堆空间的清扫工作,接着上面描述的,一旦一个函数退出了它的栈,在该函数内声明的一个Java对象那么会留在Java堆空间内,那么垃圾收集器会不会立即将这个对象的空间释放呢?答案是否认的,垃圾收集器只有在当堆空间占用到了一定程度时,或者程序比较空闲时才释放那些不再使用遗漏的

11、对象空间。如果此时程序堆空间的使用不是很大,而程序又比较忙的话,那么垃圾收集器就不会运行。当然程序员也可以通过在程序中调用JDK接口来申请虚拟机主动执行垃圾收集器。而垃圾收集器的工作和C/C+语言中明确的释放delete对象比起来有一个潜在的缺点,那就是,在垃圾收集的Java应用中程序员对于安排CPU时间进展内存回收缺乏控制,想要准确地预测出何时甚至是否进展垃圾收集、收集需要多长时间,根本上是不可能的。在早期的垃圾收集策略中,对象引用计数收集算法是最先被采用的,堆中的每个对象都有一个引用计数,当这个对象被赋值给一个变量,那么该引用计数器加1,当一个对象超过了生命期或者被重新赋值的话,对象的引用

12、减一,任何引用计数为0的对象都可以被当作垃圾收集。这样的算法一个固有的缺陷就是无法处理循环应用的情况,而且计数的增减也会带来开销。现代的Java虚拟机的实现中采用了压缩收集算法、拷贝收集算法、按代收集算法等,按代收集的算法是为了解决GC在回收对象空间的优先顺序的问题,在按代收集的算法中,GC总是优先回收那些短暂年幼的对象,而非一些寿命较长的对象。JVM堆被划分成多个小的区域子堆,每个子堆分别为不同“代的对象效劳,如果一个年幼的对象经历过好几次垃圾收集后都没有别收集掉,那么它就变成一个年老的对象,会被转移到另一个存放寿命更长的对象的堆中。一切的改进就是本着让垃圾收集更快、更高效的目标进展的。在J

13、ava的语法里面,一个对象可以拥有终结方法,该方法是在垃圾收集器释放对象前必须执行的,程序员可以通过使用该方法来实现一些应用级清扫工作。可以在编程语言级支持多线程是Java语言的一大优势,这种支持主要集中在同步上。对于编译型语言C/C+来说,在语言级是没有多线程的概念的,程序员只能通过调用操作系统API来实现多线程应用。而在Java中线程的支持是通过一些预先定义好的关键字来实现,而且JDK开发包也为用户提供了线程创立、使用的很好的封装,程序员仅仅想使用普通的类一样继承一个特定的接口Runable或者继承一个已有的简单线程类Thread即可创立并使用Java的线程功能了。应用级线程一旦创立后,就

14、交给了JVM管理,JVM内部维护这所有应用级以及JVM内部线程列表,用户可以通过指定JVM启动的参数来设置JVM的线程管理方式,是由JVM自己管理内部线程、完成线程通过工作,还是将应用线程直接绑到操作系统内核线程,并且由操作系统内核来完成线程同步等管理工作。下面会对这些参数一一进展介绍。Java内部的线程同步管理或线程调度是通过一种监视器的技术来实现的,根本上的原理如下,我们将监视器比喻成一座建筑,而其中一些特别的房间里面的数据在同一时间只能有一个“人线程能够,当一个线程进入这个房间到它离开之前,它可以独占的操作其中的数据,我们将线程进入这个建筑叫做“进入监视器,线程进入这个特殊的房间叫做“获

15、得监视器,离开房间时叫“释放监视器,离开建筑时叫做“退出监视器。监视器除了监控一些数据之外,还可以监控一些代码,这样的代码叫做监视区域,在同一监视器中,一块监视区域的代码在同一时间只能够被一个线程所。同步数据类或同步代码在Java程序中用Synchronized参数标明就可以了,从Java字节码编译器生成的虚拟机指令序列来看,编译器将操作指令monitorenter、monitorexit添加到具有Synchronized关键字的方法开场和结尾,而所有对具有Synchronized关键字的类数据的操作前后也都添加了monitorenter、monitorexit操作指令,这样在虚拟机指令序列类

16、文件代码时JVM会调用monitorenter、monitorexit指令完成线程间的同步控制。图2 Java虚拟机线程同步监视器3 JAVA虚拟机参数分类说明3.1 Java虚拟机标准参数所谓的Java虚拟机标准参数指的就是所有的虚拟机实现都应该支持的参数,这局部参数根本上都是对虚拟机根本能力的调整,包括对运行模式、垃圾收集信息显示、显示版本信息、断言开关等,下面是以Solaris下1.4.2版本为例:参数使用说明备注-d32-d64指明该Java VM是运行与32位环境还是64位环境,默认是运行在32位环境下的,如果是配置了64位模式那么需要操作系统也必须是64位的,当然CPU更需要是64位的。另外如果我们选择了-ser

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号