linux java调优

在这里插入图片描述
Tomcat 运行过程遇到Caused by: java.lang.OutOfMemoryError: PermGen space或者java.lang.OutOfMemoryError: Java heap space错误。

  1. 异常原因
    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这块内存主要是被JVM存放Class和Meta信息的。Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同。GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

Java heap space:JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。

  1. 解决办法

修改TOMCAT_HOME/bin/catalina.sh文件:

OS specific support. $var must be set to either true or false.

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Djava.awt.headless=true"

cygwin=false

darwin=false

加入以上红色JAVA_OPTS行记录后重启tomcat服务,其中JAVA_OPTS各参数的具体数值大小须根据实际服务器物理内存大小进行分配。

  1. 监控JVM

4.1 查看jdk安装路径
可选择的命令:

(1) # echo $JAVA_HOME

(2) # whereis java

(3) # which java (java执行路径)

(4) # echo $PATH

本例:

4.2 查看java进程

采用jdk提供的jps(JavaVirtual Machine Process Status Tool)小工具,可查看当前Java进程。

本例:进入/usr/java/jdk1.7.0_79目录后,执行bin/jps -v:

可看到Bootstrap 前面的数字10142即为Java进程号,同时可看到JAVA_OPTS参数生效情况。

4.3 查看JVM的GC情况

使用jstat工具查看,语法为:

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]参数解释:

*Options -选项,我们一般使用-gcutil查看GC情况

vmid -VM的进程号,即当前运行的java进程号

interval -间隔时间,单位为秒或毫秒

本例:同样在/usr/java/jdk1.7.0_79目录中查看java进程号10142且每隔3秒输出1次,执行# bin/jstat -gcutil 10142 3000 :

参数说明如下:

S0 -Heap上的Survivor space 0区已使用空间的百分比

S1 -Heap上的Survivor space 1区已使用空间的百分比

E -Heap上Eden space区已使用空间的百分比

O -Heap上的Old space区已使用空间的百分比,达到100%,就是内存溢出了

P -Perm space区已使用空间的百分比,达到100%,就是内存溢出了

YGC -从应用程序启动到采样时发生Yang GC 的次数

YGCT -从应用程序启动到采样时Yang GC所用的时间【单位秒】

FGC -从应用程序启动到采样时Full GC的次数

FGCT -从应用程序启动到采样时Full GC所用的时间

GCT -从应用程序启动到采样时用于垃圾回收的总时间【单位秒】

通过监控O、P数值情况,再次调整JAVA_OPTS相关参数大小达到优化目的。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Linux 上的 Java 程序调优,有几个常见的方面可以考虑: 1. JVM 参数调优:可以通过调整 JVM 的参数来优化 Java 程序的性能。例如,可以通过设置堆大小、垃圾回收器策略、线程池大小等参数来实现优化。可以使用工具如 jstat、jvisualvm、jmap 等来监控和分析程序的运行情况。 2. 内存管理:Java 程序在运行时会消耗大量的内存,合理管理内存可以提高程序的性能。可以通过使用合适的数据结构、避免过度创建对象、及时释放资源等方式来进行内存管理。 3. 并发控制:多线程是 Java 程序的一个特点,但不正确的并发控制可能导致性能问题。可以使用并发集合类、合理使用锁、避免竞争条件等方式来优化并发性能。 4. IO 操作优化:IO 操作通常是影响 Java 程序性能的重要因素之一。可以使用非阻塞 IO、缓冲区、批量处理等方法来提高 IO 操作的效率。 5. 数据库访问优化:如果 Java 程序需要频繁地访问数据库,可以考虑使用连接池、合理设计数据库表结构、使用索引、批量操作等方式来优化数据库访问性能。 6. 代码优化:对于性能瓶颈明显的代码片段,可以进行针对性的优化。例如,使用更高效的算法、减少循环次数、避免不必要的计算等。 请注意,以上只是一些常见的优化方面,具体的调优方法需要根据具体情况进行分析和实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值