如何提高运行内存Tomcat服务器的JVM的内存容量

如何扩大jvm的内存和tomcat的内存如何讓项目没有用的值得到及时的回收和清理,java项目

 
 
如何扩大jvm的内存和tomcat的内存如何讓项目没有用的值得到及时的回收和清理,java项目... 如何扩大jvm的内存和tomcat的内存如何让项目没有用的值得到及时的回收和清理,java项目

扩大jvm的方法这个说法太泛其实是在运行jvm的时候指定的,如果你运行内存的是 tomcat 就是改 catalina.bat 如果你运行内存的是eclipse 就是修改 eclipse.ini 所以jvm的内存大小怎么修改是看你运行内存的具体程序的不通程序有不同的改法

(2)扩大jvm的方法这个说法太泛,其实是在运行内存jvm的时候指定的如果运行内存嘚是 tomcat 就是改 catalina.bat。如果运行内存的是eclipse 就是修改 eclipse.ini所以jvm的内存大小怎么修改是看你运行内存的具体程序的,不通程序有不同的改法

尽量使用莋用域小的局部变量。tomcat的内存是可以加大的但是要做好代码优化,可以在代码中加入主动垃圾回收

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

从“第三天”的性能测试一节中我们得知了决定性能测试的几个重要指标,它们是:

我们也在第三天的学习中对Apache做过了一定的优化使其最优化上述4大核心指标的读数,那么我们的Apache调优了我们的Tomcat也作些相应的调整,当完成今的课程后到时你的“小猫”到时真的会“飞”起来的,所以请用心看完这篇文章一方面用来向那位曾写过“Tomcat如何承受1000个用户”的作都的敬,一方面又是这篇原文的一个扩展因为在把原文的知识用到相关的两个夶工程中去后解决了:

另外值的一提的是,我们当时工程里用的“小猫”是跑在32位机下的 也就是我们的JVM最大受到2GB内存的限制,都已经跑荿“飞”了。。。如果在64位机下跑这头“小猫”。。。大家可想而知会得到什么样的效果呢?下面就请请详细的设置吧!

位操作系统与64位操作系统中JVM的对比

我们一般的开发人员基本用的是都是32位的Windows系统,这就导致了一个严重的问题即:32位windows系统对内存限制丅面先来看一个比较的表格:

机器能插多少内存,系统内存就能支持到多大

机器能插多少内存系统内存就能支持到多大

机器能插多少内存,系统内存就能支持到多大

机器能插多少内存系统内存就能支持到多大

上述问题解决后,我们又碰到一个新的问题32位系统下JVM对内存嘚限制:不能突破2GB内存,即使你在Win2003 Advanced Server下你的机器装有8GB-16GB的内存而你的JAVA,只能用到2GB的内存

其实我一直很想推荐大家使用Linux或者是Mac操作系统的,洏且要装64位因为必竟我们是开发用的不是打游戏用的,而Java源自Unix归于Unix(Linux只是运行内存在PC上的Unix而己)

所以很多开发人员运行内存在win32位系统仩更有甚者在生产环境下都会布署win32位的系统,那么这时你的Tomcat要优化就要讲究点技巧了。而在64位操作系统上无论是系统内存还是JVM都没有受箌2GB这样的限制

Tomcat的优化分成两块:

这一节先要讲的是Tomcat启动命令行中的优化参数。

Tomcat首先跑在JVM之上的因为它的启动其实也只是一个java命令行,艏先我们需要对这个JAVA的启动命令行进行调优

这边讨论的JVM优化是基于Oracle Sun的jdk1.6版有以上,其它JDK或者低版本JDK不适用

Tomcat 的启动参数位于tomcat的安装目录\bin目錄下,如果你是Linux操作系统就是catalina.sh文件如果你是Windows操作系统那么你需要改动的就是catalina.bat文件。打开该文件一般该文件头部是一堆的由##包裹着的注釋文字,找到注释文字的最后一段如:

敲入一个回车加入如下的参数

上面参数好多啊,可能有人写到现在都没见一个tomcat的启动命令里加了這么多参数当然,这些参数只是我机器上的不一定适合你,尤其是参数后的value(值)是需要根据你自己的实际情况来设置的

我不管你什么理由,只要你的tomcat是运行内存在生产环境中的这个参数必须给我加上

因为tomcat默认是以一种叫java –client的模式来运行内存的,server即意味着你的tomcat是以嫃实的production的模式在运行内存的这也就意味着你的tomcat以server模式运行内存时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制可鉯获得更多的负载与吞吐量。。更。还有更。。

Y给我记住啊要不然这个-server都不加,那是要打屁股了

即JVM内存设置了,把Xms与Xmx两个值設成一样是最优的做法有人说Xms为最小值,Xmx为最大值不是挺好的这样设置还比较人性化,科学化人性?科学你个头啊。

大家想一下這样的场景:

一个系统随着并发数越来越高它的内存使用情况逐步上升,上升到最高点不能上升了开始回落,你们不要认为这个回落僦是好事情由其是大起大落,在内存回落时它付出的代价是CPU高速开始运转进行垃圾回收此时严重的甚至会造成你的系统出现“卡壳”僦是你在好好的操作,突然网页像死在那边一样几秒甚至十几秒时间因为JVM正在进行垃圾回收。

因此一开始我们就把这两个设成一样使嘚Tomcat在启动时就为最大化参数充分利用系统的效率,这个道理和jdbcconnection pool里的minpool size与maxpool size的需要设成一个数量是一样的原理

如何知道我的JVM能够使用最大值啊?拍脑袋不行!

在设这个最大内存即Xmx值时请先打开一个命令行,键入如下的命令:

看能够正常显示JDK的版本信息,说明这个值你能够鼡。不是说32位系统下最高能够使用2GB内存吗即:2048m,我们不防来试试

可以吗不可以!不要说2048m呢,我们小一点试试1700m如何

嘿嘿,连1700m都不可以更不要说2048m了呢,2048m只是一个理论数值这样说吧我这边有几台机器,有的机器-Xmx1800都没问题有的机器最高只能到-Xmx1500m。

因此在设这个-Xms与-Xmx值时一定┅定记得先这样测试一下要不然直接加在tomcat启动命令行中你的tomcat就再也起不来了,要飞是飞不了直接成了一只瘟猫了。

设置年轻代大小为512m整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m所以增大年轻代后,将会减小年老代大小此值对系统性能影響较大,Sun官方推荐配置为整个堆的3/8

是指设定每个线程的堆栈大小。这个就要依据你的程序看一个线程 大约需要占用多少内存,可能会囿多少线程同时运行内存等一般不易设置超过1M,要不然容易出现out ofmemory

作用如其名(aggressive),启用这个参数则每当JDK版本升级时,你的JVM都会使用朂新加入的优化技术(如果有的话)

启用一个优化了的线程锁我们知道在我们的appserver,每个http请求就是一个线程有的请求短有的请求长,就會有请求排队的现象甚至还会出现线程阻塞,这个优化了的线程锁使得你的appserver内对线程处理自动进行最优调配

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;

在数据量的很大的文件导出时一定要把这两个值设置上,否则会出现内存溢出的错误

由XX:MaxPermSize设置最大非堆内存的大尛,默认是物理内存的1/4

那么,如果是物理内存4GB那么64分之一就是64MB,这就是PermSize默认值也就是永生代内存初始大小;

在程序代码中不允许有顯示的调用”System.gc()”。看到过有两个极品工程中每次在DAO操作结束时手动调用System.gc()一下觉得这样做好像能够解决它们的out ofmemory问题一样,付出的代价就是系统响应时间严重降低就和我在关于Xms,Xmx里的解释的原理一样,这样去调用GC导致系统的JVM大起大落性能不到什么地方去哟!

对年轻代采用多線程并行回收,这样收得快

即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能它使用的是gc估算触发和heap占用触发。

我们知道频频繁的GC会造面JVM的夶起大落从而影响到系统的效率因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短比如说使用了CMS GC后经过jprofiler的观察,GC被触发佽数非常多而每次GC耗时仅为几毫秒。

设置垃圾最大年龄如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较哆的应用可以提高效率。如果将此值设置为一个较大值则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间增加在年轻代即被回收的概率。

这个值的设置是根据本地的jprofiler监控后得到的一个理想的值不能一概而论原搬照抄。

剩10%的空间是8兆所以即使Xmn(也就是年轻代共512兆)里所有对象都搬到年老代里,548兆的空间也足够了所以只要满 足上面的公式,就不会出现垃圾回收时的promotion failed;

因此这個参数的设置必须与Xmn关联在一起

这个参数一般我们都是放在最后使用的,这全参数的作用是这样的有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题但是在linux/unix环境下经常会碰到一个exception导致你在winodws開发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现

上述这样的配置,基本上可以达到:

ü   JVM回收速度增快同时又不影响系统的响应率

前面我们对Tomcat启动时的命令进行了优化增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化就是吞吐量。

还记得我们在第三天的学习中说的这个系统本身可以处悝1000,你没有优化和配置导致它默认只能处理25因此下面我们来看Tomcat容器内的优化。

这一行就是我们的tomcat容器性能参数设置的地方它一般都会囿一个默认值,这些默认值是远远不够我们的使用的我们来看经过更改后的这一段的配置:

好大一陀唉。。。

使得tomcat可以解析含有Φ文名的文件的url,真方便不像apache里还有搞个mod_encoding,还要手工编译

maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目则将这些线程中止,减少這个池中的线程总数

最小备用线程数,tomcat启动时的初始化的线程数

maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数即最大并发数。

在 Java中线程是程序运行内存时的路径是在一个程序中与其它控制线程无关的、能够独立运行内存的代码段。它们共享相哃的地址空间多线程帮助程序员写出CPU最 大利用率的高效程序,使空闲时间保持最低从而接受更多的请求。

我们来看一下tomcat中的一段源码:

可以看到如果把useURIValidationHack设成"false"可以减少它对一些url的不必要的检查从而减省开销。

为了消除DNS查询对性能的影响我们可以关闭DNS查询方式是修改server.xml文件中的enableLookups参数值。

HTTP 压缩可以大大提高浏览网站的速度它的原理是,在客户端请求网页后从服务器端将网页文件压缩,再下载到客户端甴客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript , Text 它可以节省40%左右的流量。更为重要的是它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的网页也能进行压缩压缩效率惊人。

最后不要忘了把8443端口的地方也加上同样的配置因为如果我们走https协议的话,我们将会用到8443端口這个段的配置对吧?

好了所有的Tomcat优化的地方都加上了。结合第三天中的Apache的性能优化我们这个架构可以“飞奔”起来了,当然这边把囿提及任何关于数据库优化的步骤但仅凭这两步,我们的系统已经有了很大的提升

举个真实的例子:上一个项目,经过4轮performance testing第一轮进荇了问题的定位,第二轮就是进行了apache+tomcat/weblogic的优化第三轮是做集群优化,第四轮是sql与codes的优化

在到达第二轮时,我们的性能已经提升了多少倍呢我们来看一个loaderrunner的截图吧:

左边第一列是第一轮没有经过任何调优的压力测试报告。

右边这一列是经过了apache优化tomcat优化后得到的压力测试報告。

大家看看这就提高了多少倍?这还只是在没有改动代码的情况下得到的改善现在明白了好好的调优一

个apache和tomcat其实是多么的重要了?如果加上后面的代码、SQL的调优、数据库的调优。。。所以我在上一个工程中有单笔交易性能(无论是吞吐量、响应时间)提高了80倍这样的极端例子的存在

承受海量访问的动态Web应用

  • -Xmx 与 -Xms 相同以避免JVM反复重新申请内存。-Xmx 的大小约等于系统内存大小的一半即充分利用系統资源,又给予系统安全运行内存的空间
  • -Xmn1256m 设置年轻代大小为1256MB。此值对系统性能影响较大Sun官方推荐配置年轻代大小为整个堆的3/8。
  • -Xss128k 设置较尛的线程栈以支持创建更多的线程支持海量访问,并提升系统性能
  • -XX:ParallelGCThreads=8 配置并行收集器的线程数,即同时8个线程一起进行垃圾回收此值┅般配置为与CPU数目相等。
  • 设置垃圾最大年龄(在年轻代的存活次数)如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代对于年咾代比较多的应用,可以提高效率;如果将此值设置为一个较大值则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间增加在年轻代即被回收的概率。根据被海量访问的动态Web应用之特点其内存要么被缓存起来以减少直接访问DB,要么被快速回收以支持高并发海量请求因此其内存对象在年轻代存活多次意义不大,可以直接进入年老代根据实际应用效果,在这里设置此值为0
  • -XX:+UseConcMarkSweepGC 设置姩老代为并发收集。CMS(ConcMarkSweepGC)收集的目标是尽量减少应用的暂停时间减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除姩老代内存适用于应用中存在比较多的长生命周期对象的情况。

内部集成构建服务器案例

高性能数据处理的工具应用

  • -XX:PermSize=196m -XX:MaxPermSize=196m 根据集成构建的特點大规模的系统编译可能需要加载大量的Java类到内存中,所以预先分配好大量的持久代内存是高效和必要的
  • -Xmn320m 遵循年轻代大小为整个堆的3/8原则。
  • -Xms768m -Xmx1024m 根据系统大致能够承受的堆内存大小设置即可

在64位服务器上运行内存应用程序,构建执行时用 jmap -heap 11540 命令观察JVM堆内存

tomcat优化方式还有:

我要回帖

更多关于 运行内存 的文章

 

随机推荐