基于JVM 调优的技巧总结分析

这篇是技巧性的文章,如果要找关于GC或者调整内纯的文章,看我其他几篇文章。因为是JVM 调优总结,所以废话少说。从各方面一共收集到以下几个方法:
1.升级 JVM 版本。如果能使用64-bit,使用64-bit JVM。   
基本上没什么好解释的,很简单将JVM升级到最新的版本。如果你还是使用JDK1.4甚至是更早的JVM,那你首先要做的就是升级。因为JVM从1.4- >1.5->1.6可不是仅仅的版本号升级,或者仅仅往里面加了一堆新的语言特性,这么简单。而是真正在JVM做了重大的改进,每次版本升级,都有巨大的性能升级。尤其是SUN认识到java是知己的全部的时候(夸张点,但连股票号都改成JAVA了,呵呵)。如果你经常逛SUN 的JVM论坛,你就会发现实际上JVM上的毛病是这么多。如果你因为各种原因,而不能升级到1.6,那你可以升级到该版本的最新版。
2.选择一个正确的GC(Gargage Collection)。
由于当JAVA程序GC的时候,会停下当前程序。尤其Full GC的时候,会停留很长时间。一般对于GUI程序来说,是很难接受的(想想Eclipse暂停的时候)。 JAVA5 以后,开始自带了好几种GC,你可以选择一个适合你的种类。有以下四种Serial Collector,Parallel collector,Concurrent Collector,Train Collector(废弃)。后面几种时候使用并行收集,所以理论上有效率更高(要求你有超过2CUP,但是现在多核开始普及了,呵呵)。提示:更改GC 种类以后要适当挺高JVM的内存量。
3.正确设置内存大小。对JVM堆内的各个区域(young,old,perm)正确设置大小。
这个是最困难的调整,因为这个调整会直接影响GC的效率。而且由于各个程序的类型不用,所以没有一个通用的数据。除了几个常用规则以外,需要使用工具(jstat,jvmstat,jconsole等等)仔细调整。下面会提到几个常用的准则。通常使用一下几个参数调整-Xms -Xmx-XX:MaxPermSize。
3.1 调高-XX:NewRatio(NewSize/MaxNewSize)的值,会减少young gc的次数,但会增加old gc的时间。
3.2 增加普通GC的方法(减小Full GC)。扩大young区域的大小(最大40%),并过大Survivor的区域。使得更多的object留在young gen。
4.减小类的使用量,注意类的load和unload,减少JSP页数。
类实际上也是对象,会直接分配perm区域里,即使Full GC也会很少收集。JSP也会分配到perm区域里,效果同理。如果perm过大,超过XX:MaxPermSize值,会发生 OutOfMemoryError: PermGen space异常。解决方法是提高-XX:MaxPermSize值。
5.避免使用-Xnoclassgc 
6.如果是RMI程序,要注意调整RMI DGC的时间。
以下是几个写程序时,应该注意的地方。也可减小GC,提高JVM性能。
1.不要使用System.gc()方法。
因为它会产生Full GC。
2.尽可能少分配大的临时对象(生命周期短的)
可能会直接分配到old区域里,old区域只有Full GC的时候会收集。
3.避免使用finalize()方法。
finalize()会增加GC的负担,使用java.lang.ref代替。

(0)

相关推荐

  • 了解Java虚拟机JVM的基本结构及JVM的内存溢出方式

    JVM内部结构图 Java虚拟机主要分为五个区域:方法区.堆.Java栈.PC寄存器.本地方法栈.下面 来看一些关于JVM结构的重要问题. 1.哪些区域是共享的?哪些是私有的? Java栈.本地方法栈.程序计数器是随用户线程的启动和结束而建立和销毁的, 每个线程都有独立的这些区域.而方法区.堆是被整个JVM进程中的所有线程共享的. 2.方法区保存什么?会被回收吗? 方法区不是只保存的方法信息和代码,同时在一块叫做运行时常量池的子区域还 保存了Class文件中常量表中的各种符号引用,以及翻译出来的

  • JVM 体系结构详解

    JVM 是一种抽象的计算机,基于堆栈架构,它有自己的指令集和内存管理,是 Java 跨平台的依据,JVM解释执行字节码,或将字节码编译成本地代码执行.Java 虚拟机体系结构如下: Class File Class File 是平台无关的二进制文件,包含着能被JVM执行的字节码,其中多字节采用大端序,字符使用一种改进的UTF-8编码.Class文件精确的描述了一个类或接口的信息,其中包括: 常量池:数值和字符串字面常量,元数据如类名.方法名称.参数,以及各种符号引用 方法的字节码指令,参数个数,

  • Java虚拟机JVM性能优化(一):JVM知识总结

    Java应用程序是运行在JVM上的,但是你对JVM技术了解吗?这篇文章(这个系列的第一部分)讲述了经典Java虚拟机是怎么样工作的,例如:Java一次编写的利弊,跨平台引擎,垃圾回收基础知识,经典的GC算法和编译优化.之后的文章会讲JVM性能优化,包括最新的JVM设计--支持当今高并发Java应用的性能和扩展. 如果你是一个开发人员,你肯定遇到过这样的特殊感觉,你突然灵光一现,所有的思路连接起来了,你能以一个新的视角来回想起你以前的想法.我个人很喜欢学习新知识带来的这种感觉.我已经有过很多次这样

  • JAVA中JVM的重排序详细介绍

    在并发程序中,程序员会特别关注不同进程或线程之间的数据同步,特别是多个线程同时修改同一变量时,必须采取可靠的同步或其它措施保障数据被正确地修改,这里的一条重要原则是:不要假设指令执行的顺序,你无法预知不同线程之间的指令会以何种顺序执行. 但是在单线程程序中,通常我们容易假设指令是顺序执行的,否则可以想象程序会发生什么可怕的变化.理想的模型是:各种指令执行的顺序是唯一且有序的,这个顺序就是它们被编写在代码中的顺序,与处理器或其它因素无关,这种模型被称作顺序一致性模型,也是基于冯·诺依曼体系的模型.

  • 浅析打开eclipse出现Incompatible JVM的解决方法

    安装了oracle10g的客户端后,eclipse打不开了.所以检查了一下,发现是以下原因.运行eclipse出现以下错误:Incompatible JVMVersion 1.3.1_01 of the JVM is not suitable for this product.Version:1.4.1 or greater is required.或Version 1.4.1_02 of the JVM is not suitable for this product.Version:1.5

  • startJVM错误Unable to load native library: libjvm.so解决方法

    startJVM是加载jvm用的方法.在JPype,apache mod等等很多地方都用到.但凡要用其他语言来加载jvm进程,就要用到这个. 可惜往往会出错.一般都是 复制代码 代码如下: Unable to load native library: libjvm.so: cannot open shared object file: No such file or directory 但是libjvm.so确实存在啊. 解决方法很简单: 在/etc/profile里面设置: 复制代码 代码如下

  • 深入JVM剖析Java的线程堆栈

    在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息. 我的目标是分享我过去十几年来在线程分析中积累的知识和经验.这些知识和经验是在各种版本的JVM以及各厂商的JVM供应商的深入分析中获得的,在这个过程中我也总结出大量的通用问题模板. 那么,准备好了么,现在就把这篇文章加入书签,在后续几周中我会给大家带来这一系列的专

  • jvm内存溢出解决方法(jvm内存溢出怎么解决)

    java.lang.OutOfMemoryError: PermGen space 发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 .然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat.还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类. 但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原

  • Android Studio 报错failed to create jvm error code -4的解决方法

    安装完 Android Studio 后启动,却报错如下: 复制代码 代码如下: failed to create jvm error code -4 这一般应是内存不够用所致,解决方法参考如下. 打开 Android Studio 安装目录下的bin目录,查找并打开文件 studio.exe.vmoptions,修改代码: 复制代码 代码如下: -Xmx512m 为 -Xmx256m 保存后应即可正常打开了.

  • JVM的垃圾回收机制详解和调优

    文章来源:matrix.org.cn 作者:ginger547 1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作. 在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能.有些垃圾收集专用于特殊的应用程序.比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率.理解了应用程序的工作负荷

随机推荐