Tomcat内存优化5 Java调优
来源:互联网 发布:java项目架构设计 编辑:程序博客网 时间:2024/05/17 02:22
Java调优
JVM调优总结
JAVA虚拟机性能参数调优指导书
Jprofiler使用介绍
Memory Analyzer (MAT)
使用Memory Analyzer tool(MAT)分析内存泄漏
JVM常见参数及其默认值:
(详见:JVM系列三:JVM参数设置、分析)
参数名称含义默认值 -Xms初始堆大小物理内存的1/64(<1GB)默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.-Xmx最大堆大小物理内存的1/4(<1GB)默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制-Xmn年轻代大小(1.4or lator) 注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.
增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8-XX:NewSize设置年轻代大小(for 1.3/1.4) -XX:MaxNewSize年轻代最大值(for 1.3/1.4) -XX:PermSize设置持久代(perm gen)初始值物理内存的1/64 -XX:MaxPermSize设置持久代最大值物理内存的1/4 -Xss每个线程的堆栈大小 JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。(校长)
和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"”
-Xss is translated in a VM flag named ThreadStackSize”
一般设置这个值就可以了。
JVM配置示例:
JAVA_OPTS="-server -XX:+UseConcMarkSweepGC -XX:PermSize=100M -XX:MaxPermSize=300M -Xms8g -Xmx8g -Xmn4g -Xss256k -XX:MaxNewSize=4g -XX:NewSize=4g -XX:SurvivorRatio=2 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:ParallelGCThreads=8 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=92 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintHeapAtGC -Xloggc:/data/resys/zhenjing/tomcat-solr-slave/logs/gc.log -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -Duser.timezone=Asia/Shanghai -XX:MaxDirectMemorySize=7g -Dcom.tc.productkey.path=/data/conf/terracotta-license.key"
说明:
# 各个堆栈区域空间分配-server -XX:PermSize=100M -XX:MaxPermSize=300M -Xms8g -Xmx8g -Xmn4g -Xss256k -XX:MaxNewSize=4g -XX:NewSize=4g -XX:SurvivorRatio=2 # eden = from+to# 回收算法相关。该配置以满足响应实时性为目的。-Xnoclassgc #禁用类垃圾回收,性能会高一点; -XX:+DisableExplicitGC #禁止System.gc()-XX:+UseConcMarkSweepGC #老年代回收采用CMS算法-XX:+UseParNewGC #年轻代回收采用并行算法-XX:ParallelGCThreads=8 -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=92 -XX:SoftRefLRUPolicyMSPerMB=0 # gc日志相关。 采用 jstat -gcutil PID 10000 监控更简洁直观。-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintHeapAtGC -Xloggc:logs/gc.log -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -Duser.timezone=Asia/Shanghai # BigMemory for Ehcache 相关配置,启用本地缓存,避免触发gc。-XX:MaxDirectMemorySize=7g -Dcom.tc.productkey.path=/data/conf/terracotta-license.key
几点说明:
Young GC: 一般情况下,当生成新对象,触发Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到空的Survivor区(to Survivor)。然后整理上次存放数据的Survivor(from Survivor),将依然存活的对象放入新的to Survivor。若多次整理后,对象依然存活,且达到阈值(由 InitialTenuringThreshold 和 MaxTenuringThreshold 控制,默认值为7和15),则将对象放入老年代。
Full GC: 主要是回收老年代的失效对象,一般同时触发整理年轻代。
几个参考数据:gc的核心工作是:清除无效对象;移动有效对象。若需要清除的无效对象很多,或需要移动的有效对象很多,则gc过程耗时。对于4G的年轻代,2G的eden代,一次Young GC大概耗时100~200ms。 若实际应用中,Young GC超过200ms,一般需要调优JVM。调优的目标:1)降低单次Young GC时间; 2) 降低Full GC次数。 Young GC 的次数和程序的负载和对象使用方式(代码实现方式)有关,优化空间不大。
测试过 -XX:+AggressiveHeap 选项,对gc影响不大。测试过 -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:+UseBiasedLocking 选项,对gc影响不大。
对于-XX:LargePageSizeInBytes=128m选项,有些麻烦,且可能导致Full GC变长,没试用。参见:http://hllvm.group.iteye.com/group/wiki/2870-JVM
Java调试辅助工具
链接的jar库可能包含重复的class,导致行为错误。
findclass.sh 用于查找特定类名出现在哪些jar包。
#! /bin/bashif [ $# -lt 2 ]; then echo "Usage: $0 classname jar1 jar2..." exit -1ficlassname=$1echo "Find Class: $classname"shiftfor file in $*do # echo $file suffix=${file##*.} if [ "x$suffix" == "xjar" ]; then grepret=`jar -tf $file | grep $classname` # echo $grepret if [ "x$grepret" != "x" ]; then echo "$file" fi fidone
jps_kill.sh 用于kill指定类名的的java进程。JVM很耗资源,当启动的JVM达到几百个时,系统负载很重,会导致jps运行变慢(1、负载重;2、进程多)。
#! /bin/bashTMP=/tmp/jps_kill.logif [ $# -lt 1 ]then echo "Usage: $0 prog_name" exit -1fijps | grep -i $1 > $TMPwhile read pid otherdo echo $pid #echo $other kill -9 $piddone < $TMP
gcstat.sh 长期监控JVM的gc状况。
#!/bin/bashPID=-1INTERVAL=1000NUM=60000000if [[ $# -lt 1 ]]then echo "Usage: $0 <vmid> [<interval(ms)> [<count>]]" exit 1fiPID=$1if [[ $# -gt 1 ]]then INTERVAL=$2fiif [[ $# -gt 2 ]]then NUM=$3fiecho "$0 Start test...`date`"echo jstat -gcutil -t -h50 $PID $INTERVAL $NUMecho "$0 Finish test.`date`"
jmap_stat.sh 长期监控jmap状况。
#!/bin/bashPID=-1INTERVAL=3NUM=60if [[ $# -lt 1 ]]then echo "Usage: $0 <vmid> [<interval> [<count>]]" exit 1fiPID=$1if [[ $# -gt 1 ]]then INTERVAL=$2fiif [[ $# -gt 2 ]]then NUM=$3fiecho "$0 Start test...`date`"echo i=0while [[ i -lt $NUM ]]do echo `date` jmap -histo:live $PID | head -n 20 echo sleep $INTERVAL ((i++))doneecho "$0 Finish test.`date`"
Java调试辅助函数
调试Java程序经常需要知道Java进程PID、当前目录、Java Home、内存使用情况、执行特定命令等等。JavaDebug收集了上述这些常用的辅助调试函数。
import java.lang.management.ManagementFactory;import java.lang.management.RuntimeMXBean;import java.io.File;import java.io.IOException;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.util.Iterator;import java.util.Map;import java.util.Properties;public class JavaDebug{ public static int getPid() { RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); String name = runtime.getName(); // format: "pid@hostname" try { return Integer.parseInt(name.substring(0, name.indexOf('@'))); } catch (Exception e) { System.err.println(e.getMessage()); return -1; } } public static void printEnv(){ Map<String,String> map = System.getenv(); Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator(); Map.Entry<String, String> entry; while (iter.hasNext()) { entry = iter.next(); String name = entry.getKey(); String value = entry.getValue(); System.out.println(name + ": "+ value); } } public static void printProperties(){ Properties pros = System.getProperties(); pros.list(System.out); } public static String getPWD(){ return System.getProperty("user.dir"); } public static void printSimpleMemoryInfo(){ Runtime runTime = Runtime.getRuntime(); System.out.println("Total Mem:" + runTime.totalMemory() + " Max Mem:" +runTime.maxMemory() + " Free mem:" + runTime.freeMemory() ); } public static void printMemoryInfo(String info){ if( info != null){ System.out.println(info+ " JavaDebug:printMemoryInfo"); } printSimpleMemoryInfo(); ExecCommand("jmap " + getPid()); } public static void ExecCommand(String cmd){ System.out.println("Exec command: "+cmd); try{ Process pro = null; Runtime runTime = Runtime.getRuntime(); if (runTime == null) { System.err.println("Create runtime false!"); throw new RuntimeException("Create runtime false!"); } pro = runTime.exec(cmd); BufferedReader input = new BufferedReader(new InputStreamReader(pro.getInputStream())); PrintWriter output = new PrintWriter(new OutputStreamWriter(pro.getOutputStream())); String line; while ((line = input.readLine()) != null) { System.out.println(line); } input.close(); output.close(); pro.destroy(); } catch(IOException e) { System.err.println(e.getMessage()); e.printStackTrace(); throw new RuntimeException("run command error!"); } System.out.println("Exec command: "+cmd + " finish."); } public static void main(String[] args) throws Exception { printProperties(); //printEnv(); System.out.println("========================"); int pid = getPid(); System.out.println("pid: " + pid); System.out.println("pwd: " + getPWD()); printMemoryInfo(null); ExecCommand("ls -l"); ExecCommand("jmap " + pid); printMemoryInfo(null); }}
http://www.cnblogs.com/zhenjing/archive/2013/02/18/java_debug.html
- Tomcat内存优化5 Java调优
- tomcat内存优化
- Tomcat内存优化设置
- 内存溢出,tomcat优化
- Tomcat内存优化
- Tomcat内存优化
- tomcat内存配置优化
- Tomcat内存优化
- TOMCAT内存优化配置
- tomcat内存配置优化
- Tomcat内存优化
- tomcat内存优化
- tomcat 内存优化2
- Tomcat内存优化
- Tomcat内存配置优化
- tomcat内存配置优化
- Tomcat 内存优化
- tomcat优化 - 线程内存优化
- 九度OJ 1076:N的阶乘 (数字特性、大数运算)
- 与markdown的第一次接触
- apache和tomcat有什么不同,为什么要整合apache 和tomcat?
- 有关于servlet 的教程
- linux常用命令
- Tomcat内存优化5 Java调优
- php 无限分类不使用递归
- TreeSet的用法
- 国际化
- grunt使用
- jquery ajax
- Week5-1Syntactic structure: Constituency vs Dependency
- 金蝶按树型组织汇总数据扩展报表实现总结
- 【PAT】1090. Highest Price in Supply Chain (25)