JAVA cpu 100%,怀疑是GC的时候出的问题,求教高手。

leeking888 2014-01-21 04:18:33
描述:
1.在Linux中运行jboss中的web项目,里面有一个socket服务。
2.在程序运行一段时间后,大概20个小时左右,会把CPU资源占用到100%。
3.我用top -Hp <pid>的方式把该进程的所有线程都显示出来,然后发现几个占用CPU资源特别大的线程tid,把tid转换为hex格式后是57a9,在jstack命令中过滤内容出来(jstack <pid> | grep -A 100 57a9),显示的是


"VM Thread" prio=10 tid=0x00007f06d8089000 nid=0x57b9 runnable

"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f06d801b800 nid=0x57a9 runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f06d801d800 nid=0x57aa runnable

"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f06d801f800 nid=0x57ab runnable

"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f06d8021000 nid=0x57ac runnable

"GC task thread#4 (ParallelGC)" prio=10 tid=0x00007f06d8023000 nid=0x57ad runnable

"GC task thread#5 (ParallelGC)" prio=10 tid=0x00007f06d8024800 nid=0x57ae runnable

"GC task thread#6 (ParallelGC)" prio=10 tid=0x00007f06d8026800 nid=0x57af runnable

"GC task thread#7 (ParallelGC)" prio=10 tid=0x00007f06d8028800 nid=0x57b0 runnable

"GC task thread#8 (ParallelGC)" prio=10 tid=0x00007f06d802a000 nid=0x57b1 runnable

"GC task thread#9 (ParallelGC)" prio=10 tid=0x00007f06d802c000 nid=0x57b2 runnable

"GC task thread#10 (ParallelGC)" prio=10 tid=0x00007f06d802e000 nid=0x57b3 runnable

"GC task thread#11 (ParallelGC)" prio=10 tid=0x00007f06d802f800 nid=0x57b4 runnable

"GC task thread#12 (ParallelGC)" prio=10 tid=0x00007f06d8031800 nid=0x57b5 runnable

"GC task thread#13 (ParallelGC)" prio=10 tid=0x00007f06d8033800 nid=0x57b6 runnable

"GC task thread#14 (ParallelGC)" prio=10 tid=0x00007f06d8035000 nid=0x57b7 runnable

"GC task thread#15 (ParallelGC)" prio=10 tid=0x00007f06d8037000 nid=0x57b8 runnable

"VM Periodic Task Thread" prio=10 tid=0x00007f06d80bf800 nid=0x57c0 waiting on condition

JNI global references: 1128

...全文
6083 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhh2008123 2016-09-28
  • 打赏
  • 举报
回复
同求解决方案
zwl_yuyang 2016-07-22
  • 打赏
  • 举报
回复
大哥,和我的情况一模一样,怎么解决的。
leeking888 2014-01-23
  • 打赏
  • 举报
回复
以下是我怀疑的一个内存有问题的地方,大家帮忙分析一下。其中SpClient是一个Socket的子类,该功能主要就是从SOCKET队列中拿出一个没有使用的,如果SOCKET已经CLOSE和DISCONNECTED,那么就从SOCKET队列中删除掉,然后再次创建一个SOCKET。 问题会不会是在队列中删除掉,没有把它释放呢?怎么样释放呢?是不是需要socket=null这样呢?

public SpClient getClient() throws SocketPoolException,
			SGIPException {
		pTime = (new Date()).getTime();
		boolean mark = false;
		boolean isEmptyClient = true;
		SpClient spClient = null;
		// 1.把已经超时的需要删除的都添加到列表中,然后从MAP中移除掉
		List<String> list = new ArrayList();
		// 
		synchronized (hashMap) {
			Iterator iter = hashMap.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry entry = (Map.Entry) iter.next();
				String key = (String) entry.getKey();
				spClient = (SpClient) entry.getValue();
				// 是否没有连接
				if (spClient.isClosed() || !spClient.isConnected()) {
					list.add(key);
				} else {
					// 检测cocket使用状态
					if (spClient.getStatus() == 0) {
						mark = true;
						break;
					}
				}
			}
			// 移除已经关闭的socket
			for (String key : list) {
				hashMap.remove(key);
			}
			// 是否找到空闲可以用的socket
			if (mark) {
				spClient.lock();
				return spClient;
			}
			// 客户端列表是否为空
			isEmptyClient = hashMap.size() < Constant.getSPClient_SOCKET_MAXNO();
		}
		// 如果socket池中socket小于10
		if (isEmptyClient) {
			// 创建新的socket
			spClient = addSocket();
			// 获取序列号Id(yyyyMMddHHssmm)+(sn+1)
			synchronized (hashMap) {
				int sn = getSn();
				SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMddHHssmm");
				String seq = dateformat.format(new Date());
				seq = seq + sn;
				this.hashMap.put(seq, spClient);
				spClient.lock();
			}
			return spClient;
		} else {
			throw new SocketPoolException(4);
		}
	}
loveunittesting 2014-01-23
  • 打赏
  • 举报
回复
引用 11 楼 leeking888 的回复:
[quote=引用 10 楼 yys79 的回复:] 我以前遇到过这个种问题,是jdk的问题,换一个就好了
怎么可能是JDK的问题呢,运行在内存满了以后就会出现CPU100%的情况。如果是JDK问题,那么出在哪里呢,总是得找到原因的啊[/quote] 我那是的情况是因为使用ibm的jdk,线程实现使用的本地c++,有bug,观察服务器线程随着访问不断增长,到了配置的峰值就cpu100%了。你这个确定是内存问题?
leeking888 2014-01-23
  • 打赏
  • 举报
回复
引用 10 楼 yys79 的回复:
我以前遇到过这个种问题,是jdk的问题,换一个就好了
怎么可能是JDK的问题呢,运行在内存满了以后就会出现CPU100%的情况。如果是JDK问题,那么出在哪里呢,总是得找到原因的啊
loveunittesting 2014-01-23
  • 打赏
  • 举报
回复
我以前遇到过这个种问题,是jdk的问题,换一个就好了
leeking888 2014-01-23
  • 打赏
  • 举报
回复
我使用netstat -an 命令看了一下,里面也没有不正常的连接,那么问题是不是可以排除了socket了呢?
leeking888 2014-01-23
  • 打赏
  • 举报
回复
引用 5 楼 rumlee 的回复:
一般情况下,java程序cpu占用100%,都是因为内存不够用了,但是GC又回收不了(socket/线程之类资源未释放、全局list或map之类),所以导致GC一直执行回收。
我感觉有这个可能性,但是现在问题不知道出在什么地方。还有什么好的建议吗?
jdgdf566 2014-01-23
  • 打赏
  • 举报
回复
高人给诊断一下吧
leeking888 2014-01-23
  • 打赏
  • 举报
回复
引用 18 楼 jdgdf566 的回复:
使变量/对象区域化,省的移除落漏,包括交叉引用。
现在的情况是机器的内存一直使用,没有释放。我们也REVIEW了代码。不大可能出现全局的
jdgdf566 2014-01-23
  • 打赏
  • 举报
回复
使变量/对象区域化,省的移除落漏,包括交叉引用。
leeking888 2014-01-23
  • 打赏
  • 举报
回复
引用 16 楼 jdgdf566 的回复:
移除没有什么不对的。不过有时候引用比较多的话,,,这个情况下通过模块化是变量/对象区域化。再就是如果用的是java7,对资源的最后一次使用放在try catch块中,会自动释放的。
环境是Jdk1.6 64bit for linux
jdgdf566 2014-01-23
  • 打赏
  • 举报
回复
移除没有什么不对的。不过有时候引用比较多的话,,,这个情况下通过模块化是变量/对象区域化。再就是如果用的是java7,对资源的最后一次使用放在try catch块中,会自动释放的。
jdgdf566 2014-01-23
  • 打赏
  • 举报
回复
40G!果然比我的personnal配置高
leeking888 2014-01-23
  • 打赏
  • 举报
回复
引用 12 楼 yys79 的回复:
[quote=引用 11 楼 leeking888 的回复:] [quote=引用 10 楼 yys79 的回复:] 我以前遇到过这个种问题,是jdk的问题,换一个就好了
怎么可能是JDK的问题呢,运行在内存满了以后就会出现CPU100%的情况。如果是JDK问题,那么出在哪里呢,总是得找到原因的啊[/quote] 我那是的情况是因为使用ibm的jdk,线程实现使用的本地c++,有bug,观察服务器线程随着访问不断增长,到了配置的峰值就cpu100%了。你这个确定是内存问题?[/quote] 确定是内存的问题,因为我服务器的内存分配的是40G,都已经用完了。但是奇怪的却是程序能正常运行。这是想不通的。
MiceRice 2014-01-22
  • 打赏
  • 举报
回复
如果要确定,就把GC日志打开,看看GC频度和GC时长。 我见过比较惨的是2秒1次GC,每次GC耗费2秒。 如果是这种情况,就要考虑下: 1、是否能扩大内存解决问题; 2、优化代码降低内存开销。
kevin-go 2014-01-22
  • 打赏
  • 举报
回复
引用 5 楼 rumlee 的回复:
一般情况下,java程序cpu占用100%,都是因为内存不够用了,但是GC又回收不了(socket/线程之类资源未释放、全局list或map之类),所以导致GC一直执行回收。
嗯,他这个应该是太多gc线程一直在执行导致的
rumlee 2014-01-22
  • 打赏
  • 举报
回复
一般情况下,java程序cpu占用100%,都是因为内存不够用了,但是GC又回收不了(socket/线程之类资源未释放、全局list或map之类),所以导致GC一直执行回收。
loveunittesting 2014-01-21
  • 打赏
  • 举报
回复
你jdk是哪个公司,哪个版本的?
leeking888 2014-01-21
  • 打赏
  • 举报
回复
引用 1 楼 fenghyun 的回复:
socket没有关闭,建立了太多的socket
你从哪里能够看出来是socket的问题呢?有没有其他参考的东西呢? 因为我只能看到了GC的任务这里占用了好大的CPU资源而已
加载更多回复(1)

81,122

社区成员

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

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