1

我有一个用于 Java 中的多线程回显服务器的简单代码(它将收到的任何内容返回给客户端)。我正在分析各种资源,包括非堆内存使用情况。我知道 JVM 的非堆内存也是在 JVM 启动时创建的,但是,它存储每个类的结构并包括调用堆栈、由本机代码分配的内存(例如用于堆外缓存)、元空间以及内存由 JIT 编译器使用(编译的本机代码)。但我有两个主要问题:

1)随着时间的推移,非堆内存使用量略有增加。增加很小,但是是什么导致内存使用量略有增加?

2)虽然随着通信客户端数量的增加,非堆内存使用量几乎相同,但如果我们放大很多,同样我们会注意到随着客户端数量的增加而略有增加。主要原因是什么?我猜这可能是由于新线程需要更多空间,但是这些线程做了什么来导致这种轻微的增加?

3) 我们也注意到与上面 2 中堆内存的相同差异。但是,差异要大得多。原因是什么?我的猜测是增加了存储消息所需的缓冲区大小。

在此处输入图像描述

4

1 回答 1

1

您说您的服务器是多线程的 - 我假设您为每个接受的套接字连接创建一个新线程。

在 JVM 中,每个线程都会消耗一些称为“堆栈”的内存,其中存储所有活动的执行帧。64 位 JVM 上的默认堆栈大小为1024K。我认为在这张非堆内存图表上,您可以看到为套接字线程分配的堆栈

于 2016-05-10T21:25:02.240 回答