JVM卡死,Eden Space为100%,求解决方案

Zenhobby 2017-02-23 04:29:23
在LInux服务器上,内存为125G,
刚开始,设置的JVM参数为-Xmx5120M,发现程序重启(看门狗ftp连接不上进程,就会将进程重启)
后来设置了-Xmx5120M -Xmn1920m,发现程序还是重启,
重启的有时候会产生hs_error文件,有时候没有产生,但共同的特点是eden space为100%
目前不知道该如何定位原因,是JVM参数没有设置正确?还是代码有问题?还是进程只是卡死后续还会恢复?
求大神给点思路
...全文
6795 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗泥丸的平方 2017-02-27
  • 打赏
  • 举报
回复
对了 你说的配置 是虚拟机的配置吗 实际上分给你的有那么多吗.
逗泥丸的平方 2017-02-27
  • 打赏
  • 举报
回复
引用 19 楼 KingCat666 的回复:
这个是截取的挂掉之后的Jstat -gccuase 的输出
这玩意看不懂啊.. 每一列是啥意思.. 最后到100的是Eden吗. 有没有查看过GC次数 在内存被占满之前是不是有特别多次的GC
  • 打赏
  • 举报
回复
-Xms5120m -Xmx5120m -Xmn1920m 只有-Xms和-Xmx设为一致时-Xmn参数才有效果,edenspace里存储的大部分都是新创建的对象,看看是不是对象都是启动时生成的,可以考虑下懒加载。
Zenhobby 2017-02-25
  • 打赏
  • 举报
回复
引用 16 楼 qq_35209952 的回复:
[quote=引用 14 楼 KingCat666 的回复:] [quote=引用 13 楼 trocp 的回复:] FTP接收数据应该是边收边写入文件,全部存在内存的话,很容易秒爆
现在怀疑是FTP接收数据量太大,待会会记录一下,看看重启之前的FTP数据量是不是也在激增 话说用的Apache 提供的FTP Server API,设置了setMaxLogins最大登陆数,好像也没有任何作用[/quote] 等一下.. 我好像被你绕进去了 ... FTP 为什么会用堆内存.. FTP 是文件传输协议呀... 不是这一层的吧 [/quote] 用的Apache FTP API,使用代码实现的,改了一些api的接收函数,在接收到数据就会存到队列中,但队列也是有长度的,我也只是猜测是这一块,但也不确定,好崩溃,目前能确定的就是Eden激增到100%,十几秒没有反应就会被看门狗重启,但Eden为什么为激增,找不到原因,同样的程序在其他机器上运行也好几个月了,就只有几台不好使
Zenhobby 2017-02-25
  • 打赏
  • 举报
回复


这个是截取的挂掉之后的Jstat -gccuase 的输出
jiajing1990_ 2017-02-24
  • 打赏
  • 举报
回复
jmap -dump:format=b,file=heap.bin <pid> dump一下 然后用MemoryAnalyzer.exe分析一下 看看内存增长在哪里了,一定要在重启之前
oO临时工Oo 2017-02-24
  • 打赏
  • 举报
回复
引用 6 楼 KingCat666 的回复:
[quote=引用 4 楼 trocp 的回复:] 导致JVM Eden Space为100%,说明堆内存对象操作很多很快。 只要不出现tomcat:java.lang.OutOfMemoryError: PermGen space的异常,说明堆内存还是够用的。 主要看看Perm(永久代)的利用率,如果把你5G都用完了,我只能说很有可能程序有问题。 产生hs_error文件,可以根据日志内容来分析。不过这些hs_error文件很有可能是看门狗杀死java进程后留下的。
hs_error文件里面看到:出现异常的时候正在与运行的线程是VM Thread,推测是JVM在GC的时候崩溃的[/quote] hs_error贴出来看看 把你的配置文件贴出来看看(最好时用jvisualvm 查看实际的运行参数配置)
Zenhobby 2017-02-24
  • 打赏
  • 举报
回复
引用 4 楼 trocp 的回复:
导致JVM Eden Space为100%,说明堆内存对象操作很多很快。 只要不出现tomcat:java.lang.OutOfMemoryError: PermGen space的异常,说明堆内存还是够用的。 主要看看Perm(永久代)的利用率,如果把你5G都用完了,我只能说很有可能程序有问题。 产生hs_error文件,可以根据日志内容来分析。不过这些hs_error文件很有可能是看门狗杀死java进程后留下的。
hs_error文件里面看到:出现异常的时候正在与运行的线程是VM Thread,推测是JVM在GC的时候崩溃的
Zenhobby 2017-02-24
  • 打赏
  • 举报
回复
虽然设置-Xmn为5G,但程序卡死的是我用jmap和jstat都查看了内存 Jmap:显示年轻为160M,而且为100% Jstat:每秒查看GCUtil 可以看到Eden一下子从11% 升到100%,此后就卡死了,S0 S1 E O YGC FGC都不再变化 很奇怪为什么Eden为什么一秒就升到了100%,不知道是因为那会数据量太大还是程序有问题 如果是数据量太大,有没有什么方法可以从代码层面去避免,大家有什么想法
逗泥丸的平方 2017-02-24
  • 打赏
  • 举报
回复
引用 14 楼 KingCat666 的回复:
[quote=引用 13 楼 trocp 的回复:] FTP接收数据应该是边收边写入文件,全部存在内存的话,很容易秒爆
现在怀疑是FTP接收数据量太大,待会会记录一下,看看重启之前的FTP数据量是不是也在激增 话说用的Apache 提供的FTP Server API,设置了setMaxLogins最大登陆数,好像也没有任何作用[/quote] 等一下.. 我好像被你绕进去了 ... FTP 为什么会用堆内存.. FTP 是文件传输协议呀... 不是这一层的吧
逗泥丸的平方 2017-02-24
  • 打赏
  • 举报
回复
引用 12 楼 KingCat666 的回复:
哎,数据不在本机,拿不出来,只能远程看看 现在想解决的是如果是FTP接收数据量太大,怎么能让Eden不要激增到100%
这是假设呀.. 你有了假设可以去试验一下呀,如果不是这样的原因就可以排除掉了 搞一个本地的环境试试 ? 要不然你想了半天解决方法,然后发现不是这个原因就尴尬了.. 不过FTP 我也不懂..胡说两句 接收文件一般是有个cache吧,然后读一块写一块.. 难道是无限大的.. 有点像持久化的感觉. 再就是应该也有用堆外内存的实现吧..不过我也只是听说过 还有就是再提一下硬盘问题.. 硬盘满了会有奇怪的现象..
Zenhobby 2017-02-24
  • 打赏
  • 举报
回复
引用 13 楼 trocp 的回复:
FTP接收数据应该是边收边写入文件,全部存在内存的话,很容易秒爆
现在怀疑是FTP接收数据量太大,待会会记录一下,看看重启之前的FTP数据量是不是也在激增 话说用的Apache 提供的FTP Server API,设置了setMaxLogins最大登陆数,好像也没有任何作用
oO临时工Oo 2017-02-24
  • 打赏
  • 举报
回复
FTP接收数据应该是边收边写入文件,全部存在内存的话,很容易秒爆
Zenhobby 2017-02-24
  • 打赏
  • 举报
回复
引用 7 楼 trocp 的回复:
[quote=引用 6 楼 KingCat666 的回复:] [quote=引用 4 楼 trocp 的回复:] 导致JVM Eden Space为100%,说明堆内存对象操作很多很快。 只要不出现tomcat:java.lang.OutOfMemoryError: PermGen space的异常,说明堆内存还是够用的。 主要看看Perm(永久代)的利用率,如果把你5G都用完了,我只能说很有可能程序有问题。 产生hs_error文件,可以根据日志内容来分析。不过这些hs_error文件很有可能是看门狗杀死java进程后留下的。
hs_error文件里面看到:出现异常的时候正在与运行的线程是VM Thread,推测是JVM在GC的时候崩溃的[/quote] hs_error贴出来看看 把你的配置文件贴出来看看(最好时用jvisualvm 查看实际的运行参数配置) [/quote] 哎,数据不在本机,拿不出来,只能远程看看 现在想解决的是如果是FTP接收数据量太大,怎么能让Eden不要激增到100%
Zenhobby 2017-02-24
  • 打赏
  • 举报
回复
引用 9 楼 qq_35209952 的回复:
[quote=引用 5 楼 KingCat666 的回复:] 虽然设置-Xmn为5G,但程序卡死的是我用jmap和jstat都查看了内存 Jmap:显示年轻为160M,而且为100% Jstat:每秒查看GCUtil 可以看到Eden一下子从11% 升到100%,此后就卡死了,S0 S1 E O YGC FGC都不再变化 很奇怪为什么Eden为什么一秒就升到了100%,不知道是因为那会数据量太大还是程序有问题 如果是数据量太大,有没有什么方法可以从代码层面去避免,大家有什么想法
内存上去之后 手动GC 有效果吗? jmap好像是先会调GC再查对象的.. -Xmn1920m 感觉小了点.. 来看看这个..虽然老了点 但是我看新的文章也都是在转他的.. http://unixboy.iteye.com/blog/174173/ 再就是给一下更完整的参数吧... 还有注意一下硬盘空间是怎样的 [/quote] 有一太机器 现在设置了三个参数 -Xms5120m -Xmx5120m -Xmn1920m,目前已经有两天没有重启了,不知道后面会不会重启 -Xss没有设置,目前没有计算应该多少,所以没有设置,不知道设置之后会不会有什么影响
逗泥丸的平方 2017-02-24
  • 打赏
  • 举报
回复
err日志里面有没有OOM错误, 硬盘空间是不是满了.(当前目录的空间)
逗泥丸的平方 2017-02-24
  • 打赏
  • 举报
回复
引用 5 楼 KingCat666 的回复:
虽然设置-Xmn为5G,但程序卡死的是我用jmap和jstat都查看了内存 Jmap:显示年轻为160M,而且为100% Jstat:每秒查看GCUtil 可以看到Eden一下子从11% 升到100%,此后就卡死了,S0 S1 E O YGC FGC都不再变化 很奇怪为什么Eden为什么一秒就升到了100%,不知道是因为那会数据量太大还是程序有问题 如果是数据量太大,有没有什么方法可以从代码层面去避免,大家有什么想法
内存上去之后 手动GC 有效果吗? jmap好像是先会调GC再查对象的.. -Xmn1920m 感觉小了点.. 来看看这个..虽然老了点 但是我看新的文章也都是在转他的.. http://unixboy.iteye.com/blog/174173/ 再就是给一下更完整的参数吧... 还有注意一下硬盘空间是怎样的
oO临时工Oo 2017-02-23
  • 打赏
  • 举报
回复
导致JVM Eden Space为100%,说明堆内存对象操作很多很快。 只要不出现tomcat:java.lang.OutOfMemoryError: PermGen space的异常,说明堆内存还是够用的。 主要看看Perm(永久代)的利用率,如果把你5G都用完了,我只能说很有可能程序有问题。 产生hs_error文件,可以根据日志内容来分析。不过这些hs_error文件很有可能是看门狗杀死java进程后留下的。
Zenhobby 2017-02-23
  • 打赏
  • 举报
回复
占用内存最多的对象是byte[] 跟 String,程序本来是接收数据并保存数据的,byte[]跟String占用空间大,也是合情合理的,分析很多次也没有看出来啥 -_-
yql1986 2017-02-23
  • 打赏
  • 举报
回复
使用jvm 相关的命令 抓取一下内存 dump 分析一下dump 看那个对象占用最多 再结合程序分析一下,可以找出问题
加载更多回复(1)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧