CPU使用不高,内存使用很大的问题?

进展

第一步
以下命令重点查找pid、关注内存占用数量和比例
	top #使用shift + m 排序内存使用
	ps axuf | sort -n -k3
第二步
csdn、云栖社区、百度中找各种帖子
https://blog.csdn.net/lycyingO/article/details/80854669 #和现有问题相识度很高
第三步
在自己aliyun服务器上使用gdb,感觉并不好用。perf太复杂,主要是侵入式,不适用于服务器,暂时不予考虑
注:#期间使用的一些命令
pmap -x pid | sort -n -k3 #查看pid内存使用情况

ulimit -a  #显示当前的各种系统对用户使用资源的限制
第四步
1、分析拿到服务器时候生成的dump文件,没发现什么异常。
2、和同事要更久远他生成的dump文件,对比也没发现异常。
注:#期间使用的一些命令
jstat -gc pid 3s #每三秒打印一次gc的情况

jmap -heap pid #查看内存区占用情况

jstack pid #查看当前进程线程的执行

jmap -dump:format=b,file=xxx#文件名# pid
第五步
没有头绪,验证一下之前的想法。---“服务器内存使用率很高是不是jvm分配相关”
配合实施修改启用参数,从4G内存改成3G
注:#期间使用的配置内容
java -Xmx3072m -Xms3072m #配置3G内存,大小分配一致可以防止回收后重分配
ps:参考某ai公司和某安全公司的一些配置:
1、java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:UseParallelGC -XX:ParallelGCThreans = 20
2、-Xms2G -Xmx2G -Xmn300M -XX:SurvivorRatio=1 -XX:PermSize=1G -XX:MaxPermSize=1G -XX:+UseParNewG C -XX:+UseConcMarkSweepGC -XX:CMSInitiating0ccupancyFraction=80 -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt socket, , address=9527 -verbose:gc -XX:+PrintGCDetaiIs -XX
第六步
服务器加入生产负载中,不敢随便动服务器。在这期间查阅发现的另一个问题,FGC频率比较高的原因。---“注:gc时长正常。ygc频率低,大约六分半钟,这个大约是年轻代内存分配比较大的原因。fgc频率高,大约一天两次,按说老年代也分配1G的内存,而且ygc的次数并不是很多,所以可能是内存泄露引起的”
注:#查阅文档,记录一些可能的情况---"fgc频繁"
0、Runtime.getRuntime().exec(commend); 使用后输出流和出错流没有输出(代码中存在没有输出出错流)
1、阿里OSSClient使用后没有正常关闭(代码中少量存在)
2、IO流没有正常关闭(代码中存在一些)
3、conn未关闭(存在)---“需要注意的是需要关闭conn中的io流,然后关闭conn”
4、堆外内存的使用,既IO操作直接内存的时候(待验证)
5、程序显示的方式调用system.gc(),且系统没有禁用
	注:1、关联到查看dump文件的时候byte[]、char[]数量特别大(个人想法,无依据)
			2、垃圾回收忽略io流,有些可以关闭是api中已实现自动关闭,类似closeablexxx这种(盲点)
第七步
服务器运行两天,发现内存占用相比于之前较少,但还是大于配置内存(大约600m) ---“1、继续让服务器跑一段时间,在看下内存使用情况。2、大概率存在堆外内存使用的情况,有时间需进一步排查下”
备注
1、排查项目中io使用后关闭
2、排查项目conn是否使用后不关闭、关闭时需要先关闭io
3、Runtime.getRuntime().exec(commend);使用ProcessBuilder builder = new ProcessBuilder();builder.command(commend);替代,因为ProcessBuilder可以引导出错流builder.redirectErrorStream(true);
4、JVM参数配置(待完成)---“初步想法是配置总内存使用大小、年轻代内存使用大小(经典是内存5/8,老年代是3/8)、年轻带比例(经典是3:1:1)、元空间使用大小、堆外内存使用最大值、使用cms和par垃圾回收器” ---“https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 具体配置需先了解下官方配置解释,结合想使用的配置在从网上查找利弊关系后定夺”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java应用程序CPU过高内存不高的原因有以下几个可能: 1. 程序中存在大量的计算密集型操作或循环。Java是一种高级编程语言,它的执行速度相对较慢。如果应用程序中存在很多循环或者大量的复杂计算,就容易导致CPU占用率高。 2. 程序中存在死循环或者无限递归调用。死循环或者无限递归调用会导致程序陷入无限循环中,CPU会一直占用在该循环中,从而导致CPU占用率过高,而内存占用率不高。 3. 使用了不合理或者低效的算法。如果应用程序中使用了不合理或者低效的算法,就会导致CPU占用率高。这种情况下,可以尝试使用更加高效的算法或者数据结构来优化程序的性能。 4. 多线程使用不当。Java是支持多线程编程的语言,如果在程序中使用了大量的线程,并且这些线程之间存在竞争条件或者同步问题,就可能导致CPU占用率高。在使用多线程时,需要合理地进行线程管理和资源分配,避免出现资源争用导致的CPU过高问题。 综上所述,Java应用程序CPU过高而内存不高的原因可能是程序中存在大量的计算密集型操作、死循环或者无限递归调用、使用了不合理或者低效的算法,或者多线程使用不当等。在解决这个问题时,可以尝试优化程序的算法、检查并修正死循环或者无限递归调用的问题、合理利用多线程等方式来降低CPU的占用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值