总结Linux平台java开发遇到的问题

2014/12/1 22:41 下午 目录  Java 评论

环境:centos7 minimal 、 JDK1.7 、tomcat 6.5

Tomcat容器运行时内存配置

#由于tomcat默认没有Xms Xmx Perm等配置信息,需要在tomcat安装目录下bin/catalina.sh中
#添加JAVA_OPTS='-server -Xms512m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=512M' 
#具体哪一行请自行分析脚本,或求助搜索引擎
[root@kvm32 ~]# ps -ef |grep tomcat
root      2771     1 19 3月06 ?       04:52:22 java -Djava.util.logging.config.file=/root/apache-tomcat-6.0.43/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m -Djava.endorsed.dirs=/root/apache-tomcat-6.0.43/endorsed -classpath /root/apache-tomcat-6.0.43/bin/bootstrap.jar -Dcatalina.base=/root/apache-tomcat-6.0.43 -Dcatalina.home=/root/apache-tomcat-6.0.43 -Djava.io.tmpdir=/root/apache-tomcat-6.0.43/temp org.apache.catalina.startup.Bootstrap start
root     15227 17968  0 23:54 pts/9    00:00:00 grep --color=auto tomcat

启动参数与内存相关的是: -server -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m

JAVA_OPTS相关参数意义:

  • -server: 一定要作为第一个参数,在多个CPU时性能佳
  • -Xms: 初始化heap堆内存值用于存放类实例(Instance)的内存
  • -Xmn: heap最小值
  • -Xmx: heap内存最大值 (没有设置该值时,默认根据操作系统的设置获取进程能够获取的最大值一般是64M ????
  • -Xss: 线程内存值 jdk 5.0之后不用设置
  • -XX: PermSize 加载class占用的永久内存,不会被gc释放(jvm默认大小4M)
  • -XX: MaxPermSize

JAVA_OPTS相关参数设置规则

  • -Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值
  • -Xmx 不要超过物理内存80%(环境中没有其他服务,生产环境没有频繁周期性的热部署)
  • -Xmx 一般设置为物理内存的一半

常见tomcat内存相关的报错信息

  1. java.lang.OutOfMemoryError: PermGen space

    • PermGen space是指内存的永久保存区域,存放Class和Meta信息
    • GC(Garbage Collection)不能对PermGen space进行清理
    • 这种错误常见在web服务器对JSP进行pre compile的时候(开发期间)。
    • 如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)也会产生此错误信息了。

    手动设置-XX:PermSize -XX:MaxPermSize 大小

  2. java.lang.OutOfMemoryError: Java heap space

    • heap为堆内存,用来存储java类的实例即对象(Object),可被GC回收
    • heap大小与JVM提供的-Xmn -Xms -Xmx等选项有关
    • 默认值(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。????
    • 如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息

    根据环境手动设置-Xms和-Xmx的值,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。-Xmx不要超过可用物理内存的80%

jmap分析java进程堆栈使用情况12 3

#找到jmap安装路径
rpm -ql  `rpm -qa |grep jdk` |grep jmap |grep -v man
#查找tomcat进程号
ps -ef |grep tomcat|grep -v grep
#执行jmap 参数为-heap  查看进程堆内存使用情况
/usr/java/jdk1.7.0_60/bin/jmap -heap 31274

执行结果:


  1. 浅析Java进程占用过高内存问题http://www.android100.org/html/201407/24/45464.html 

  2. 推荐普通开发者学习使用的6个JDK内建工具 http://www.importnew.com/17308.html 

  3. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 http://www.open-open.com/lib/view/open1390916852007.html