我有一个用于 Java 中的多线程回显服务器的简单代码(它将收到的任何内容返回给客户端)。我正在分析各种资源,包括非堆内存使用情况。我知道 JVM 的非堆内存也是在 JVM 启动时创建的,但是,它存储每个类的结构并包括调用堆栈、由本机代码分配的内存(例如用于堆外缓存)、元空间以及内存由 JIT 编译器使用(编译的本机代码)。但我有两个主要问题:
1)随着时间的推移,非堆内存使用量略有增加。增加很小,但是是什么导致内存使用量略有增加?
2)虽然随着通信客户端数量的增加,非堆内存使用量几乎相同,但如果我们放大很多,同样我们会注意到随着客户端数量的增加而略有增加。主要原因是什么?我猜这可能是由于新线程需要更多空间,但是这些线程做了什么来导致这种轻微的增加?
3) 我们也注意到与上面 2 中堆内存的相同差异。但是,差异要大得多。原因是什么?我的猜测是增加了存储消息所需的缓冲区大小。