超多线程初始化和启动性能测试与分析

测试时间:2019/01/09
测试目的:java多线程在线程数超大时的性能
测试方法:使用运行1000, 10000, 50000, 100000和其他辅助数量的线程进行时间和内存的监视,对Thread和Runnable都进行了测试。
实验硬件:台式电脑一台,配置为 i7 3930K 6C12T, 32GB DDR 1833, 256GB SSD.
实验结论:

  1. Runnable和Thread性能差距可以忽视。
  2. 线程数在1万以下,每秒可以初始化和启动1万条线程,而总量超过1.1万条以后,每秒只能启动约2500条线程。所以建议在一个java程序中开启的线程中不要超过1万个。
  3. 另外补充了一个实验,同时运行2个程序(两个进程)各建立1万和10万条线程,发现彼此独立没有影响,所以,如果需要更多的线程。这可以采用多程序(多进程)来实现。

附:所用到的java代码和实验输出数据。

// 主程序入口
public class MassiveThreadTest {

	public static void main(String[] args) {
		int threadCount = args.length > 0 ? Integer.parseInt(args[0]) : 1000;
		int type = args.length > 1 && "0".equals(args[1]) ? 0 : 1;

		if (type == 0)
			runByThread(threadCount);
		else
			runByRunnable(threadCount);
	}


	static void runByThread(int threadCount) {

		showMemory();
		long t1 = System.currentTimeMillis();
		ThreadUnit[] arr = new ThreadUnit[threadCount];

		showMemory();
		for (int i = 0; i < arr.length; i++)
			arr[i] = new ThreadUnit();

		showMemory();
		long t2 = System.currentTimeMillis();
		for (int i = 0; i < arr.length; i++)
			arr[i].start();

		showMemory();
		long t3 = System.currentTimeMillis();

		System.out.printf("Init: %d ms. \nStart: %d ms.\n", t2 - t1, t3 - t2);
	}


	static void runByRunnable(int threadCount) {
		showMemory();
		long t1 = System.currentTimeMillis();
		RunnableUnit[] arr = new RunnableUnit[threadCount];

		showMemory();
		for (int i = 0; i < arr.length; i++)
			arr[i] = new RunnableUnit();

		showMemory();
		long t2 = System.currentTimeMillis();
		for (int i = 0; i < arr.length; i++)
			new Thread(arr[i]).start();

		showMemory();
		long t3 = System.currentTimeMillis();

		System.out.printf("Init: %d ms. \nStart: %d ms.\n", t2 - t1, t3 - t2);
	}
	
	/**
	 * Format a integer to GB, MB or KB
	 * 
	 * @param filesize
	 * @return
	 */
	public static String formatFileSize(long filesize) {
		if (filesize < 0) {
			return "Error: Current filesize is less then zero. (Size = " + filesize + ")";
		}
		long quotion = filesize;
		long mode = 0;
		double result = quotion;
		int i = 0;
		String[] name = { "B", "KB", "MB", "GB", "TB", "PB", "ZB" };
		String str = "";

		while (true) {
			if (result < 1024) {
				str = String.format("%4.2f %s", result, name[i]);
				break;
			}

			i++;
			mode = quotion % 1024;
			quotion = quotion / 1024;
			result = mode * 1.0 / 1024 + quotion;

			if (i >= name.length) {
				str = "too large to express...";
				break;
			}
		}
		return str;
	}

	/**
	 * show memory info
	 */
	public static void showMemory() {
		Runtime r = Runtime.getRuntime();
		long mfree = r.freeMemory();
		long mtotal = r.totalMemory();
		long mused = mtotal - mfree;

		System.out.printf("used = %s, free = %s, total = %s.\n", formatFileSize(mused), formatFileSize(mfree),
				formatFileSize(mtotal));
	}

}


public class RunnableUnit implements Runnable {

	@Override
	public void run() { 
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}


public class ThreadUnit extends Thread {
	@Override
	public void run() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

实际运行结果。

Microsoft Windows [版本 10.0.17134.471]
(c) 2018 Microsoft Corporation。保留所有权利。

D:\data>java -jar HelloWorld.jar
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
Init: 16 ms.
Start: 84 ms.

D:\data>java -jar HelloWorld.jar 10000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
Init: 35 ms.
Start: 904 ms.

D:\data>java -jar HelloWorld.jar 100000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 61.68 MB, free = 429.32 MB, total = 491.00 MB.
used = 61.68 MB, free = 429.32 MB, total = 491.00 MB.
Init: 181 ms.
Start: 34217 ms.

D:\data>java -jar HelloWorld.jar 50000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 33.41 MB, free = 457.59 MB, total = 491.00 MB.
used = 33.41 MB, free = 457.59 MB, total = 491.00 MB.
Init: 101 ms.
Start: 17386 ms.

D:\data>java -jar HelloWorld.jar 20000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 15.42 MB, free = 475.58 MB, total = 491.00 MB.
used = 15.42 MB, free = 475.58 MB, total = 491.00 MB.
Init: 62 ms.
Start: 5061 ms.

D:\data>java -jar HelloWorld.jar 10000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
Init: 40 ms.
Start: 899 ms.

D:\data>java -jar HelloWorld.jar 1000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
Init: 13 ms.
Start: 90 ms.

D:\data>java -jar HelloWorld.jar 5000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 7.71 MB, free = 483.29 MB, total = 491.00 MB.
used = 7.71 MB, free = 483.29 MB, total = 491.00 MB.
Init: 36 ms.
Start: 411 ms.

D:\data>java -jar HelloWorld.jar 10000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
Init: 52 ms.
Start: 900 ms.

D:\data>java -jar HelloWorld.jar 15000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 12.85 MB, free = 478.15 MB, total = 491.00 MB.
used = 12.85 MB, free = 478.15 MB, total = 491.00 MB.
Init: 48 ms.
Start: 3921 ms.

D:\data>java -jar HelloWorld.jar 12000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 12.85 MB, free = 478.15 MB, total = 491.00 MB.
used = 12.85 MB, free = 478.15 MB, total = 491.00 MB.
Init: 41 ms.
Start: 3188 ms.

D:\data>java -jar HelloWorld.jar 10100
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
Init: 39 ms.
Start: 882 ms.

D:\data>java -jar HelloWorld.jar 11000
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
Init: 51 ms.
Start: 919 ms.

D:\data>java -jar HelloWorld.jar 11000 
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
Init: 55 ms.
Start: 3847 ms.

D:\data>java -jar HelloWorld.jar 50000 
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 33.41 MB, free = 457.59 MB, total = 491.00 MB.
used = 33.41 MB, free = 457.59 MB, total = 491.00 MB.
Init: 138 ms.
Start: 14781 ms.

D:\data>java -jar HelloWorld.jar 1000 1
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
Init: 16 ms.
Start: 85 ms.

D:\data>java -jar HelloWorld.jar 10000 1
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
used = 10.28 MB, free = 480.72 MB, total = 491.00 MB.
Init: 39 ms.
Start: 883 ms.

D:\data>java -jar HelloWorld.jar 100000 1
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 5.14 MB, free = 485.86 MB, total = 491.00 MB.
used = 61.68 MB, free = 429.32 MB, total = 491.00 MB.
used = 61.68 MB, free = 429.32 MB, total = 491.00 MB.
Init: 206 ms.
Start: 32419 ms.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值