设为首页 收藏本站
查看: 450|回复: 0

[经验分享] 修改Tomcat的运行内存 & JSP中查看当前的内存使用状况

[复制链接]

尚未签到

发表于 2017-2-9 08:49:54 | 显示全部楼层 |阅读模式
  一、设置JVM内存设置
  1. 设置JVM内存的参数有四个:
  -Xmx    Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
  -Xms    Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
  -Xmn    Java Heap Young区大小,不熟悉最好保留默认值;
  -Xss    每个线程的Stack大小,不熟悉最好保留默认值;
  2. 如何设置JVM内存分配:
  (1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):
  java -Xmx128m -Xms64m -Xmn32m -Xss16m Test
  (2)当在集成开发环境下(如eclipse)启动并使用JVM时:
  a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配):

  • -vmargs  
  • -Xms40m  
  • -Xmx256m 
  -vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。
  此处设置的参数值可以通过以下配置在开发工具的状态栏显示:
  在eclipse根目录下创建文件options,文件内容为:org.eclipse.ui/perf/showHeapStatus=true
  修改eclipse根目录下的eclipse.ini文件,在开头处添加如下内容:

  • -debug  
  • options  
  • -vm  
  • javaw.exe 
  重新启动eclipse,就可以看到下方状态条多了JVM信息。
  b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)
  编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m
  c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效)
  选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m
  注:如果在同一开发环境中同时进行了b和c设置,则b设置生效,c设置无效,如:
  开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为:
  -Xmx256m -Xms64m
  (3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效):
  a. 设置环境变量:
  变量名:CATALINA_OPTS
  变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m
  b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,将其中的%CATALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m
  二、查看设置JVM内存信息
  Runtime.getRuntime().maxMemory();  //最大可用内存,对应-Xmx
  Runtime.getRuntime().freeMemory();  //当前JVM空闲内存
  Runtime.getRuntime().totalMemory();  //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和
  关于maxMemory(),freeMemory()和totalMemory():
  maxMemory()为JVM的最大可用内存,可通过-Xmx设置,默认值为物理内存的1/4,设值不能高于计算机物理内存;
  totalMemory()为当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和,会随着JVM使用内存的增加而增加;
  freeMemory()为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很 小,而JVM实际可用内存并不等于freeMemory(),而应该等于 maxMemory()-totalMemory()+freeMemory()。及其设置JVM内存分配。
  在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步。
  PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance。
  GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误
  Java Heap分为3个区
1.Young
2.Old
3.Permanent
  Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。
  JVM的Heap分配可以使用-X参数设定,
  -Xms
初始Heap大小

-Xmx
java heap最大值 
  -Xmn
young generation的heap大小
  JVM有2个GC线程
第一个线程负责回收Heap的Young区
第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区

Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。
为什么一些程序频繁发生GC?
  有如下原因:
1.程序内调用了System.gc()或Runtime.gc()。
2.一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
3.Java的Heap太小,一般默认的Heap值都很小。
4.频繁实例化对象,Release对象 此时尽量保存并重用对象,例如使用StringBuffer()和String()。
  如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态,许多Server端的Java程序每次GC后最好能有65%的剩余空间
  经验之谈:
  1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。
2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。
  注意:
  1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
  Stack的设定
每个线程都有他自己的Stack。
  -Xss
每个线程的Stack大小
  Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
  硬件环境
  硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用。
  4种GC
  1、第一种为单线程GC,也是默认的GC,该GC适用于单CPU机器。
2、第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
3、第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
4、第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
  单文件的JVM内存进行设置
  默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。
设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。
java -Xms64m -Xmx256m Test
-Xms是设置内存初始化的大小
-Xmx是设置最大能够使用内存的大小(最好不要超过物理内存大小)
  tomcat启动jvm内存设置
  Linux:
  在/usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh添加:JAVA_OPTS='-Xms512m -Xmx1024m'要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值Windows
在catalina.bat最前面加入
set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.但是如果不是执行startup.bat启动tomcat而是 利用windows的系统服务启动tomcat服务,上面的设置就不生效了,就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是 catalina.bat的设置.解决办法:
  修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
  原值为
  -Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs加入 -Xms300m -Xmx350m
  重起tomcat服务,设置生效
  weblogic启动jvm内存设置
  在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。
  JBoss
  默认可以使用的内存为64MB
$JBOSSDIR$/bin/run.config
JAVA_OPTS = "-server -Xms128 -Xmx512"
  Eclipse
  在所在目录下,键入
eclipse.exe -vmargs -Xms256m -Xmx512m
256m表示JVM堆内存最小值
512m表示JVM堆内存最大
  Websphere
  进入控制台去设置:应用程序服务器 > server1 > 进程定义 > Java 虚拟机
  
配置Demo如下:

在catalina.bat中加上红色那行

set _EXECJAVA=%_RUNJAVA%
set MAINCLASS=org.apache.catalina.startup.Bootstrap
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=
set JAVA_OPTS= -Xms512M -Xmx1024M


===JSP中查看当前的内存使用状况=


Runtime lRuntime = Runtime.getRuntime();
out.println("*** BEGIN MEMORY STATISTICS ***");
out.println("Free  Memory: "+lRuntime.freeMemory()/1024/1024+"M");
out.println("Max   Memory: "+lRuntime.maxMemory()/1024/1024+"M");
out.println("Total Memory: "+lRuntime.totalMemory()/1024/1024+"M");
out.println("Available Processors : "+lRuntime.availableProcessors()+"");
out.println("*** END MEMORY STATISTICS ***");

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-339513-1-1.html 上篇帖子: 【转】form表单提交数据编码方式及tomcat的接受编码方式 下篇帖子: Eclipse3.2+Tomcat 5.0.28(5.5.17)+lomboz-all-in-one-win32 配置(web开发)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表