Java虚拟机(七):JVM调优案列
Eclispe启动优化
概述
什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配、回收的情况来调整各区域内存比例或者gc回收的策略;更深一层就是根据dump出来的内存结构和线程栈来分析代码中不合理的地方给予改进。eclipse优化主要涉及的是前者,通过gc日志来分析。本文主要是通过分析eclipse gc日志为例来示例如何根据gc日志来分析jvm内存而进行调优,像根据关闭eclipse启动项、关闭各种校验等措施来优化eclipse本文不再阐述,网上有很多,本次测试的eclipse已经进行了配置上面的优化。
准备环境
eclipse版本:Release 4.5.0
eclipse 默认配置:eclipse.ini
-startup plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.300.v20150602-1417 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.7 -Xms256m -Xmx1024m
在配置的末尾处添加如下配置文件:
-XX:+PrintGCDetails // 输出GC的详细日志
-XX:+PrintGCDateStamps // 输出GC的时间戳(以日期的形式)
-Xloggc:gc.log // 输出GC的详细日志
eclipse启动计时插件:
http://www.chendd.cn/information/viewInformation/experienceShare/148.a
GChisto.jar:gc日志分析工具jar包一个
Visual GC: java自带的内存监控工具,通过visual gc可以实时的监控到各个内存区域的变化。
如何分析GC日志
摘录GC日志一部分(蓝色为年轻代gc回收;绿色为full gc回收):
2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]
2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]
通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回城,耗时长,因此一般尽量减少full gc的次数
通过两张图非常明显看出gc日志构成:
young gc 日志
Full GC日志
启动调优
启动eclipse查看默认配置下启动时间大概是22秒。
根据GChisto分析gc日志看出来,启动过程中进行了一次full gc,19次minor gc;full gc和young gc的时间差不多都是0.65秒左右。
第一步优化:
为了避免内存频繁的动态扩展,直接把-Xms配置和-Xmx一致,修改如下:
-Xms1024m
修改完毕,重新启动:
启动时间缩小到17秒,分析gc日志得出young gc22次,full gc没有了! 但是young gc增加了两次。
第二步优化:
因为本机的内存8G,给eclipse分配1g还是有点小了,简单粗暴直接所有内存配置加倍。
配置如下:
--launcher.XXMaxPermSize
512M
--launcher.XXMaxPermSize
512m
-Xms2048m
-Xmx2048m
启动时间缩小到15秒,但是 young gc已经缩短到只有7次,说明因为gc回收导致eclipse 启动慢的问题已经初步解决
第三步优化:
通过Visual GC看到在eclipse启动的时候classloader加载class的时间有一些,关闭字节码可能会优化一部分启动时间,加入如下参数:
-Xverify:none(关闭Java字节码验证,从而加快了类装入的速度)
重新启动测试,启动时间已经优化到了9秒!
查看启动日志,young gc 的次数仅仅只有了一次!
至此优化结束,附最终的eclipse.ini文件
-startup plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.300.v20150602-1417 -product org.eclipse.epp.package.jee.product --launcher.defaultAction openFile --launcher.XXMaxPermSize 512M -showsplash org.eclipse.platform --launcher.XXMaxPermSize 512m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.7 -Xms2048m -Xmx2048m -Xverify:none -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
Tomcat服务器优化
1、JDK内存优化
根据服务器物理内容情况配置相关参数优化tomcat性能。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。 Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大.
Tomcat默认可以使用的内存为128MB,Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下设置: JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】 -XX:PermSize=64M -XX:MaxPermSize=128m' 需要把几个参数值调大。例如: JAVA_OPTS='-Xms256m -Xmx512m' 表示初始化内存为256MB,可以使用的最大内存为512MB。
参数详解
-server 启用jdk 的 server 版; -Xms java虚拟机初始化时的最小内存; -Xmx java虚拟机可使用的最大内存; -XX:PermSize 内存永久保留区域 -XX:MaxPermSize 内存最大永久保留区域 -Xmn jvm最小内存
32G 内存配置示例:
JAVA_OPTS="$JAVA_OPTS -Xms10g -Xmx10g -XX:PermSize=1g -XX:MaxPermSize=2g -Xshare:off -Xmn1024m
2、tomcat线程优化
在tomcat配置文件server.xml中的配置中,和连接数相关的参数有:
maxThreads: Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值150。
acceptCount: 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。
minSpareThreads: Tomcat初始化时创建的线程数。默认值25。
maxSpareThreads: 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值75。
enableLookups: 是否反查域名,默认值为true。为了提高处理能力,应设置为false
connnectionTimeout: 网络连接超时,默认值60000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
maxKeepAliveRequests: 保持请求数量,默认值100。 bufferSize: 输入流缓冲大小,默认值2048 bytes。
compression: 压缩传输,取值on/off/force,默认值off。 其中和最大连接数相关的参数为maxThreads和acceptCount。如果要加大并发连接数,应同时加大这两个参数。
32G 内存配置示例:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" maxThreads="1000" minSpareThreads="60" maxSpareThreads="600" acceptCount="120" redirectPort="8443" URIEncoding="utf-8"/>
使用visualvm性能监控
1、什么是VisualVM
visualvm是jdk自带的一款监控工具。它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的程序的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据
2、如何安装
在jkd bin目录下有一个jvisualvm.exe文件 双击就可以使用
3、如何使用jvisualvm
1、配置JMX管理tomcat:
set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false - Dcom.sun.management.jmxremote.ssl=false
2、重启tomcat即可
3、双击jvisualvm.exe 添加服务器IP地址,添加需要监控jmx端口即可
效果如下:
本文转载自
原文作者:纯洁的微笑
原文地址:http://www.cnblogs.com/ityouknow/p/5378874.html
原文地址:https://www.cnblogs.com/ityouknow/p/6437037.html