记一篇oom问题、解决以及jvisualvm工具连接使用

一、oom问题以及解决

问题:系统有动态显示日志的功能,测试环境没有问题,上线正式环境测试功能出现oom问题

报错信息:java.lang.OutOfMemoryError: GC overhead limit exceeded

分析报错:点击显示日志按钮出现oom报错,并且错误表明 JVM 花费了太多时间在垃圾收集上,但回收的内存却很少,这通常是因为程序在不断地创建新的对象,而这些对象很快就被认为是垃圾,但它们的回收效率很低。一般报错oom会把错误类、方法报出,分析对应的类、方法就好。

错误代码:

第一行代码使用了Commons IO库中的FileUtils类来读取一个文件的所有行,并将这些行存储在一个List<String>集合中。

第二行代码获取了文件的行数。

两行代码很简单,但是读取大型文件的时候会快速占用jvm堆内存,导致oom问题

修改以后的代码:

采用流式一行一行读取文件,然后使用变量统计文件行数。解决oom问题

二、jvisualvm使用

jvisualvm为jvm自带工具,打开jvm目录下的bin

双击打开显示页面为:

点击远程,填写远程主机信息,主机信息为服务器ip

之后选择添加jmx连接

添加JMX表单的话,连接ip就是服务器ip,后面的端口需要配置容器,这里拿tomcat举例

cd tomcat/bin

 vim catalina.sh 

添加如下语句

JAVA_OPTS='-Duser.timezone=GMT+08 -server -Xmx4096m -Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=xx.xx.xx.xx -Dcom.sun.management.jmxremote.port=xxxx -Dcom.sun.management.jmxremote.rmi.port=xxxx -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.managementote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -XX:+UnlockCommercialFeatures -XX:+FlightRecorder'

Djava.rmi.server.hostname=xx.xx.xx.xx 为服务器ip地址

-Dcom.sun.management.jmxremote.port=xxxx 为监听接口和下面的port保持一致,监听端口为自定义,可以是0-65535任何一个没有被占用的端口

-Dcom.sun.management.jmxremote.rmi.port=xxxx

 配置好以后重启tomcat(注意,配置后使用shutdown.sh不能杀掉tomcat,如果代码引用了shutdown.sh要注意,关掉tomcat直接kill)

如果服务器开着防火墙应该放行配置的port,以iptables为例,放行指令为:

iptables -I INPUT -p TCP --dport xxxx -j ACCEPT

之后尝试在本地 cmd,telnet xxx.xxx.xxx.xxx xxxx连接服务器,测试通信是否正常。如果通信没问题把刚刚配置的port输入到下图:后

确认连接。

连接以后可以查看jvm详细信息、GC信息、类加载信息等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值