`

Java线程: New他就Start他 (遇见JDK1.4.2_04以前的一个bug)

阅读更多

我们的系统有OutOfMemory现象, Liu同学最近又发现了一个原因:Sun JDK 1.4.2_04版本(含以前)的bug,

我们系统另一个OOM的原因参见:Derby: Out Of Memory & Update

对与sun的这个bug我以前一无所知, 有必要记录下来, 学习一下.

 

Bug现象:

一个线程如果只是new, 而没有start(), 那么该线程不会被垃圾回收,

我们系统使用的一个jar包(日方提供的), 里面有一个api, 功能是去网络上通过snmp协议取一个mib值,

反编译过来发现他有这种"只是new一个线程,并没有start"的问题,

于是系统持续运行就导致了OutOfMemory

 

另:该bug在jdk5,6 上测试,已经修正.

(艾~这么久的bug我们也能遇到,关于使用底版本的原因我就不另作点评了, 否则又要郁闷了...此处省略1W字^^)

 

下面这两个链接

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4533087

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508232

 

上面这两个链接已经将bug描述得很清楚了, 但是我害怕以后我会找不到这两个链接,

因为现在一些bea的东西我就已经找不到地方了, 所以见bug原因和测试代码抽出如下:

 

Bug4533087的测试代码:

 

class ThreadLeak {

	static MyThread t;

	public static void main(String[] args) {

		if ((args.length > 0) && args[0].equals("run")) {
			System.out.println("Creating and running 10,000 threads...");
			for (int i = 0; i < 10000; i++) {
				t = new MyThread(true);
			}
		} else {
			System.out
					.println("Creating 10,000 threads, but not running them...");
			for (int i = 0; i < 10000; i++) {
				t = new MyThread(false);
			}
		}

		System.out.println("Running garbage collector...");
		System.gc();

		System.out.println("Done.  Heap size is "
				+ (Runtime.getRuntime().totalMemory() - Runtime.getRuntime()
						.freeMemory()));
	}
}

class MyThread implements Runnable {

	Thread t;

	public MyThread(boolean bRun) {
		t = new Thread(this, "MyThread");
		if (bRun) {
			t.start();
		}
	}

	public void run() {
		/* NO-OP */
	}
}
 

 

 

Bug4508232的测试代码:

 

package thread;

//   AliveTest.java:   program to test theory that Threads which are not started
//                     are not garbage collected

//   - We create "T" Threads but don't "start" them.  The output shows:
//      a)  that creation is fast (compared to -starting- Threads)
//      b)  that memory is garbage collected
//      c)  the Thread ACTIVE count always increases
//      d) eventually we run out of memory

public class AliveTest {

	public static void main(String[] args) {
		long t1 = System.currentTimeMillis();
		Runtime r = Runtime.getRuntime();

		for (int i = 1;; i++) {
			//OK
			new T().start();
			
			//OutOfMemory
			//new T();
			if (i % 100 == 0) {
				System.out.println("Threads created: " + i + ", t: "
						+ (System.currentTimeMillis() - t1) / 1000
						+ " sec, activeCount: " + Thread.activeCount()
						+ ",   Free mem:" + r.freeMemory() / 1000 + " K");
			}
		}
	}

}

class T extends Thread {
	int[] a = new int[10000];

	public void run() {
		a[0] = 1;
	}
}

 

Bug4533087中对原因的描述:

 

写道
The reason is that the java.lang.Thread class adds the thread to the thread group in the init() method, which is called from the constructor. It removes the thread from the thread group in the exit() method, which is only called if the thread is run. So if the thread is never run, the thread group still has a reference to the Thread and it will never be garbage collected. And of course any objects which the thread has references to will in turn not be garbage collected.
 

 

 

分享到:
评论

相关推荐

    jdk1.4.2_06

    这个描述表明`jdk1.4.2_06`是一个早期版本的Java Development Kit(JDK),在当前的互联网资源中已经相对稀少。JDK是Oracle公司提供的用于开发和运行Java应用程序的工具集合,它包含了Java编译器、调试器、JVM(Java...

    jdk1.4.2_08

    总的来说,JDK1.4.2_08是Java发展历程中的一个重要里程碑,它的各种改进和新特性为Java开发者提供了更强大、更稳定的开发环境。虽然现在最新的JDK版本已经更新到了许多个版本,但理解并掌握早期版本的功能和特性对于...

    jdk1.4.2_04.rar

    JDK 1.4.2_04是Oracle公司发布的一个较早版本,发布于2004年,是Java SE(标准版)平台的一部分。这个版本在当时具有很高的专业品质,被广泛用于开发和部署各种Java应用。 在JDK 1.4.2中,有几个关键的更新和改进...

    jdk1.4.2_07

    JDK 1.4.2_07 是一个较早版本的Java开发工具包,由Sun Microsystems(现已被Oracle公司收购)发布。这个版本是Java平台标准版(Java SE)的一部分,主要用于开发和运行基于Java的应用程序。它包含了编译器、调试器、...

    j2sdk1.4.2_09.zip

    "j2sdk1.4.2_09.zip"这个压缩包就为此目的而存在,它包含了Java 2 Standard Edition (J2SE) 的1.4.2_09版本,这是一个在2004年发布的Java SDK。 JDK 1.4是Java发展历程中的一个重要里程碑,它引入了许多关键的新...

    jdk 1.4.2 windows

    JDK 1.4.2 是 Java 平台标准版(Java SE)的一个早期版本,由 Sun Microsystems(现已被 Oracle 收购)开发。这个版本在2004年发布,提供了许多新的特性和改进,对于当时的开发者来说具有重要意义。尽管现在已经有了...

    jdk1.4.2免安装版

    jdk1.4老资源,留一份自用。JDK1.4.2 无需安装,解压后直接使用。

    解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题

    以上所述是小编给大家介绍的解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对软件开发网网站的支持! ...

    非安装jdk1.4.2.rar

    JDK 1.4.2是Oracle公司发布的一个早期版本,发布于2004年,它在Java的发展历程中扮演了重要的角色,引入了许多新的特性和改进。 在标题"非安装jdk1.4.2.rar"中,关键词“非安装版”指的是这个JDK版本不需要通过传统...

    jdk1.4.2.zip

    Java JDK 1.4.2 是Java开发工具包的一个较早版本,由Sun Microsystems(后被Oracle公司收购)发布。这个版本在Java发展历程中占据着重要地位,因为它引入了许多关键特性和改进,对于当时的开发者来说是重要的里程碑...

    jdk1.4.2源代码

    JDK1.4.2是Java开发工具包的一个重要版本,它的源代码对于理解Java语言的底层实现和优化有着极高的价值。本文将从核心组件、类库结构以及关键功能等方面,深入剖析JDK1.4.2的源代码,帮助开发者提升对Java技术的理解...

    jdk1.8.0_231

    配置环境变量,vi /etc/profile,在文件最后添加配置 JAVA_HOME=/usr/local/java/jdk1.8.0_231/ JRE_HOME=/usr/local/java/jdk1.8.0_231/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_...

    j2sdk1.4.2_07.zip

    Java 2 SDK 1.4.2_07 是Oracle公司发布的一个早期版本的Java开发工具包,主要用于Java应用程序和应用程序服务器的开发、部署和管理。这个版本在当时被认为是相当稳定的,因此对于那些需要在旧系统上运行或者依赖于...

    JDK1.4.2官方英文API

    JDK 1.4.2 是Java历史上的一个重要版本,发布于2004年,它引入了许多新的特性和改进,对当时的Java开发者具有重大意义。本篇将深入探讨JDK 1.4.2的官方英文API中的关键知识点。 1. **NIO (Non-blocking I/O)** JDK...

    jdk1.8.0_202.rar

    JDK 1.8.0_202是Oracle公司发布的一个重要版本,针对Windows操作系统提供32位(i586)和64位(x64)两种版本,为开发者带来了稳定且高效的Java开发环境。 一、JDK 1.8.0_202概述 JDK 1.8.0_202是Java 8系列的一个更新...

    jdk1.7.0_80

    总之,`jdk1.7.0_80`是Java 7的一个重要更新,它集成了许多实用功能和性能改进,对于那些依赖Java 7特性的项目来说,是一个可靠的选择。然而,考虑到软件安全性和新技术的采纳,开发者也应该考虑适时升级到更高级别...

    Linux jdk1.8.0_171下载

    【标题】"Linux jdk1.8.0_171下载" 涉及的知识点主要集中在Java开发工具包(Java Development Kit, JDK)的版本1.8.0_171在Linux操作系统上的安装与使用。JDK是Java编程语言的核心组件,包含了编译器、调试器、文档...

    j2sdk1.4.2_06.zip

    标题中的"j2sdk1.4.2_06.zip"是一个老旧版本的JDK,具体来说是Java 2 Platform Standard Edition (J2SE) 1.4.2的第六个更新版本。这个版本发布于2004年,距今已有相当一段时间,但在某些特定场景下,如兼容旧系统或...

    官方原版jdk1.6.0_45提取

    JDK1.6.0_45是Oracle公司发布的一个特定版本,它属于Java 6系列,这个版本的发布日期是在2014年,主要是为了修复之前版本中的安全漏洞和性能问题。 JDK1.6.0_45包含了以下关键组件: 1. **Java Runtime ...

    Java_jdk1.8.0_241 环境变量

    首先,`JAVA_HOME` 是一个系统环境变量,它指向Java开发工具集(JDK)的安装目录。在Windows系统中,如果JDK被安装在`C:\Program Files\Java\jdk1.8.0_241`,那么应该将`JAVA_HOME`设置为这个路径。这个变量使得其他...

Global site tag (gtag.js) - Google Analytics