`
zhao3546
  • 浏览: 21873 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Linux下的Socket异常导致OutOfMemory,定位结果Linux下JVM Bug。

阅读更多
现网出现一个问题,Client访问我们的接入服务器A,A将请求转给服务器B(Http请求,使用HttpURLConnection实现);某天,B服务器突然宕机,Client在登录的过程中,经常需要访问B,B宕机一段时间后,A也报出OutOfMemoryError。

这个问题定位了很久,开始以为我们的代码有问题,以为IO流没有关闭,打开GC日志进行压力测试,没有发现堆内存问题。
但JVM还是宕机。

之后,在Linux下,我们模拟现网的情况,访问另一机器的不存在的端口,在大并发的情况下,Xmx设为1024m,大概12个小时,JVM会OutOfMemory;如果将Xmx设为1700m,不到一小时,JVM就会OutOfMemory;

HttpURLConnection是基于TCP实现的,所以为了进一步验证,我把HttpURLConnection改成了Socket,同样访问另一机器的不存在的端口,也会出现同样的问题;

在Windows下,我也经过两样的验证,跑了10多个小时,没有出现异常,因此,可以断定,Linux下的JVM 1.5实现有Bug。Socket实现是依赖本地的实现的,Linux下的Socket实现有Bug,导致JNI内存溢出。

-----------------------------

希望遇到同样问题的朋友,可以少走弯路。
分享到:
评论
4 楼 zhao3546 2008-09-27  
可以肯定是JDK的Bug,测试的JDK版本为Linux JDK1.5_03

我使用JDK1.5_06后,没有问题。
3 楼 zhao3546 2008-09-26  
感谢上面两位的回复。
此处我要说明,你们说的问题绝对不存在,如果有你们说的异常,我早就可以定位出问题来了。

另外,同样的代码在Windows下为什么不出错?

----- 测试代码如下:
使用 java -Xms1024m -Xmx1024m Main启动下面的代码,在Linux下测试,
如果将 -Xmx1500m 或者更大,JVM死得更快。


import java.io.IOException;
import java.net.Socket;

public class Main implements Runnable {
	public static void main(String[] args) {
		int threads = 500;
		try {
			threads = Integer.parseInt(args[0]);
		} catch (Exception e) {
		}

		for (int i = 1; i <= threads; i++) {
			new Thread(new Main()).start();
		}
	}

	public void run() {
		while (true) {
			socketConnect();
		}
	}

	public void socketConnect() {
		Socket socket = null;
		try {
			socket = new Socket("127.0.0.1", 59998); // 请保证该端口59998没有Socket在监听。
		} catch (IOException e) {
			// e.printStackTrace();
		} finally {
			if (socket != null) {
				try {
					socket.close();
				} catch (IOException e) {
					// 不作处理
				}
			}
		}
	}
}
2 楼 theone 2008-09-25  
嘿嘿,明显是打开的文件句柄过多造成的JVM进程crash。
1 楼 dennis_zane 2008-09-25  
给出代码,socket的实现有差异,但不至于访问不在监听的端口就出现OOM。我猜测你们的问题在于打开的socket超过了进程允许的最大文件句柄数,也就是说没有正常关闭出现异常的socket或者HttpURLConnection

相关推荐

    tomcat out of memory

    - **查看错误日志**:Tomcat的`catalina.out`日志会记录`Out of Memory`错误的具体信息,帮助定位问题。 - **使用JConsole或JVisualVM**:这些JDK自带的工具可以实时监控JVM的内存使用情况,辅助诊断。 - **分析...

    使用Memory Analyzer tool 检测OutofMemory异常

    标题 "使用Memory Analyzer tool检测OutofMemory异常" 涉及到的是Java内存管理的一个重要环节,即如何通过工具分析并解决程序运行时出现的内存溢出问题。Memory Analyzer Tool (MAT) 是由Eclipse基金会开发的一款...

    BlazeDS+Spring+activeMQ outofmemory

    标题 "BlazeDS+Spring+activeMQ outofmemory" 指的是在使用BlazeDS、Spring和ActiveMQ集成的环境中遇到了内存溢出问题。BlazeDS是一个开放源码的服务器端技术,它允许双向通信,使Flex或AJAX客户端能够与Java后端...

    OutOfMemory的一个解决方法

    在Java编程中,`OutOfMemoryError`是一种常见的运行时异常,它通常发生在JVM试图为新对象分配内存时,但堆内存空间已满或无法进一步扩展的情况下。这个错误可以分为几种类型,包括`PermGen space`、`Heap Space`、`...

    tomcat out of memory solution

    标题与描述中的关键词“Tomcat Out of Memory Solution”指向了在运行Tomcat服务器时遇到内存溢出错误(Out of Memory Error)的解决方法。在IT领域,尤其是Java应用服务器环境中,Tomcat作为一款广泛使用的开源轻量...

    linux 下用java 获取系统信息 cpu mem jvm等

    linux 下用java 获取系统信息 cpu mem jvm等 用java调用系统命令得到,方便实用

    解决Python运行文件出现out of memory框的问题

    在Python编程过程中,有时会遇到一个令人头疼的问题——"out of memory",即内存不足。这个问题通常发生在程序尝试分配超出系统可用内存的空间时。当Python解释器无法为新对象分配足够的内存时,它会抛出`Memory...

    jvm memory

    jvm memory

    Linux简单调优与JVM参数.docx

    Linux 服务器调优与 JVM 参数调优 本文主要介绍了 Linux 服务器调优和 JVM 参数调优的相关知识点,以便提高服务器性能和 JVM 应用程序的运行效率。 Linux 服务器调优 Linux 服务器调优是指对 Linux 操作系统的...

    jvm异常分析文件

    本篇文章将深入探讨基于给定文件名的JVM异常分析主题,包括socket端口占用问题和内存溢出系统异常,以及如何解决这些问题以防止异常宕机。 首先,让我们关注"623scoket端口占有和内存溢出系统异常分析"这个文件。...

    美团JVM问题定位和排错

    ### 美团JVM问题定位和排错 #### 背景 在现代软件开发中,Java虚拟机(JVM)作为运行Java程序的基础平台,对于任何使用Java语言进行开发的服务都至关重要。然而,在实际运行过程中,由于复杂的运行环境和技术栈的...

    JVM 输出 GC 日志导致 JVM 卡住

    JVM 输出 GC 日志导致 JVM 卡住 JVM 输出 GC 日志导致 JVM 卡住是一个常见的问题,尤其是在高并发和高性能应用中。这个问题的根源在于 JVM 的垃圾回收机制(Garbage Collection,GC),它会在 JVM 运行时周期性地...

    MemoryAnalyzer JVM堆内存分析工具

    MemoryAnalyzer(MAT)是一款强大的JVM堆内存分析工具,由IBM开发并开源,它提供了详尽的内存分析报告,帮助开发者定位内存问题,提升程序效率。本文将详细介绍MemoryAnalyzer的主要功能、使用方法以及其在实际开发...

    JVM调优和Linux常见面试题.zip

    在IT行业中,JVM(Java Virtual Machine)调优和Linux系统操作是两个至关重要的技能,尤其是在处理大型企业级应用时。对于Java开发者来说,理解JVM的工作原理并能进行有效的调优,可以显著提升应用程序的性能和稳定...

    jvm-memory-view-0.93.162

    在Android Studio中集成"JVM Memory View"后,开发者可以在调试模式下轻松访问此工具。通过查看内存视图,可以定位到内存消耗过大的代码段,优化内存分配,提升应用性能。 四、优化实践 1. **适当对象复用**:减少...

    MemoryAnalyzer-JVM

    《深入理解MemoryAnalyzer:JVM内存分析利器》 在Java应用程序的开发和优化过程中,内存管理是一项至关重要的任务。MemoryAnalyzer(MAT)是一款强大的JVM内存分析工具,它能够帮助开发者深入洞察应用的内存占用...

    Linux下安装NC无法显示中文

    在 Linux 环境下安装 NC 时,安装界面的中文经常显示为乱码,导致界面无法正常显示中文字符。这是由于 JVM 无法找到用来显示中文的字库所致。以下是解决该问题的详细分析和解决方案。 一、问题分析 在基于 AWT 的...

    iReport中文字符在linux下字体问题解决方法借鉴.pdf

    在 Linux 环境下使用 iReport 时,中文字符可能会出现字体问题,导致报表无法正确打印或导出。解决这个问题的关键是确保系统中安装了正确的字体环境。 第一个问题是 iReport 在 Windows 下打印功能正常,而部署到 ...

    jvm参数设置

    本文将基于提供的文件内容,深入解析Linux环境下JVM的基本参数设置方法及原理。 #### 一、内存参数设置 在JVM参数配置中,内存管理是最为关键的部分之一。下面我们将详细解释几个重要的内存相关参数及其作用: 1....

Global site tag (gtag.js) - Google Analytics