性能问答>Xss/ThreadStackSize配置真正含义是什么?>
5回复

Xss/ThreadStackSize配置真正含义是什么?



如下代码:


	private static final ThreadPoolExecutor EXECUTOR = (ThreadPoolExecutor) Executors.newCachedThreadPool();

	public static void main(String[] args) {
		for (; ; ) {
			EXECUTOR.execute(() -> {
				try {
					TimeUnit.MILLISECONDS.sleep(200L);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			});
		}
	}

启动参数-Xss1m,当开启到线程数有20K+时,整个进程使用的内存也只有500M+,按照线程栈1m*20K+≈2G才对,这还不算堆内存。为什么只占用了500M呢?有劳大佬解惑!

3087 阅读
请先登录,再评论

这是分配的虚拟内存,并不是真正的物理内存,物理内存的分配是靠操作系统根据实际情况来控制的

1年前
回复 你假笨:

我遇到过一次虚拟机崩溃进程退出的情况,看了日志里面有三万一千多个线程,进程退出的原因是创建新的线程申请内存失败,机器128G,可用七十多,错误日志提示可能的原因是64位机器上内存分配是32G,需要开启一个启动参数。把占用的内存加一加差不多有32了,所以最后觉得就是这个原因。那这里就有个疑问,我遇到的为什么是直接分配的物理内存,而这边说是虚拟内存?难道是因为我遇到的物理内存比较充足吗?

1年前回复
回复 你假笨:

感谢假笨老师解答。

接着补充下:使用pmap -X pid可以看到当前进程的内存映射情况。

1年前回复

会不会存在交换的内存,共享的内存,虽然线程数有这么多,实际上每个线程实际占用的没这么多,线程之间共享了一部分内存,使之每个线程1m.以上都是瞎猜的。仅供参考

1年前

1m*20K+≈20G,上面算错了。

1年前