Java性能优化

参考:残星的博客,网址:http://transcoder.tradaquan.com/from=844b/bd_page_type=1/ssid=739f313432353037373131391a18/uid=0/pu=usm%401%2Csz%401320_2001%2Cta%40iphone_1_10.1_3_602/baiduid=1A7E69A7749A5A3FE802BF1273168613/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=7884388148744003705&order=1&fm=alop&h5ad=1&srd=1&dict=32&tj=www_normal_1_0_10_title&vit=osres&m=8&cltj=cloud_title&asres=1&title=XmsXmxPermSizeMaxPermSize%E5%8C%BA%E5%88%AB-%E6%AE%8B%E6%98%9F-%E5%8D%9A%E5%AE%A2%E5%9B%AD&w_qd=IlPT2AEptyoA_yivCkrhJiIkrw4JLr_bDB3&sec=22717&di=72d135271f1faf0d&bdenc=1&tch=124.0.302.192.0.0&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_ytK1DK6mlrte4viZQRAXzb6N87NEVz7sSPQps-DcyzyKTEz7qR2rKtmxmdN78rwdcbsgACAKxYOeAlpPwGAUDYpzK&eqid=6d6af93f7d2fa000100000015975f59e&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1500902817207%2C%22sig%22%3A%222895%22%2C%22xpath%22%3A%22div-a-h3-em%22%7D



   类加载子系统负责从文件系统或者网络中加载Class信息,加载信息放到一个叫做方法区的内存空间,常量也可。

  Java堆在虚拟机启动的时候建立,Java对象实例都放在堆中。

Java的NIO库允许Java程序直接使用内存,它是Java堆外的、直接向系统申请的内存空间。访问直接内存的速度优于Java堆。直接内存在Java堆外,不受限于Xmx指定的大小。

Java性能优化

每一个Java虚拟机线程都有一个私有的Java栈,保存局部变量、方法参数、同时和Java方法的调用、返回密切相关。


Java虚拟机可以使用Java_HOME/bin/java程序启动(JAVA_HOME)。


2 方法区的设置

JDK1.6、JDK1.7中,方法区可以理解为永久区(Perm),永久区可以使用参数-XX:PermSize和-XX:MaxPermSize指定,默认情况下,-XX:MaxPermSize为64M。

-XX:+PrintGCDetails  -XX:PermSize=5M  -XX:MaxPermSize=5m


在jdk1.8中,永久区被彻底移除,用元数据区来代替,其大小可以使用参数-XX:MaxMetaspaceSize指定,是堆外的直接内存。如果不指定大小,虚拟机会耗尽所有可用的系统内存。

一般GC打印为:-XX:+PrintGC,之后启动JVM后,则遇到GC会打印如下。

[GC  4793K->377K(15872K), 0.0006926 secs]             GC前,堆空间使用量为4MB,GC后堆空间为377KB。


3 新生代的配置

-Xmn可以设置新生代的大小,较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,一般设置为整个堆空间的1/3到1/4左右。

-XX:SurvivorRatio用来设置新生代中eden空间和from/to空间的比例。含义如下:

-XX:SurvivorTatio=eden/from=eden/to

如:

-Xmx20m  -Xms20m  -Xmn1m  -XX:SurvivorRatio=2   -XX:+PrintGCDetails


这里eden与from的比值为2:1  ,故eden区为512KB,总可用新生代512+256=768,  总大小512+256+256=1024KB=1MB

如果 byte[] b=new byte[1*1024*1024];由于eden区无法容纳1MB数组,故只能占用老年代空间。

使用-XX:NewRatio来设置新生代和老年代的比例。含义如下:

-XX:NewRatio=老年代/新生代

Java性能优化



4 栈配置

栈是每个线程私有的内存空间,可以使用-Xss参数指定线程的栈大小。


5 直接内存配置

直接内存跳过了Java堆,使Java程序可以直接访问原生堆空间,从一定程度上加快了内存空间的访问速度。

最大可用直接内存可以使用参数-XX:MaxDirectMemorySize设置,默认为最大堆空间,即-Xmx。当直接内存使用量达到最大时,就会触发垃圾回收。

6 运行模式

Java虚拟机支持Client和Server两种运行模式。使用-version参数可以查看当前的运行模式。


Java性能优化


7 GC回收算法

复制算法比较适用于新生代(因新生代存活对象少,垃圾对象多,需要复制少),标记压缩算法是一种老年代的回收算法。

Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。



8 Xms  Xmx  PermSize  MaxPermSize区别

8.1 参数含义

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

-vmargs 说明后面是VM参数,其实是JVM参数

-Xms128M初始堆内存,-XmxJVM最大允许分配的堆内存,按需分配。

-XX:PermSize=64M JVM初始分配非堆内存  -XX:MaxPermSize=128M  JVM最大允许的非堆内存。