gpt4 book ai didi

java - Java相关的Native内存是如何被清除的。我了解 GC 不会清除它

转载 作者:行者123 更新时间:2023-12-02 00:40:56 24 4
gpt4 key购买 nike

似乎当有 IO 操作等待外部服务时,很多线程正在 sun.misc.Unsafe.park 处等待。这导致 native 内存积累无法被清除。这个 native 内存如何被清除。一段时间后会自动清除吗

最佳答案

使用每个连接线程 IO 会产生以下内存成本:

  1. 线程堆栈
  2. ByteBufferbyte[] 传递给读/写/发送/接收方法
  3. 可能是一个反弹缓冲区(openjdk 实现细节),因为系统调用需要一个固定缓冲区,而 java 数据结构可以由 GC 移动
  4. IO 函数之上的附加抽象和应用程序在连接的生命周期内保持 Activity 状态
  5. 内核套接字内存
<小时/>
  1. 可以通过调整 -Xss 参数进行一些调整。完整的修复需要通过非阻塞/异步 IO 在更少的线程上复用多个连接。 AsynchronousSocketChannel 使之易于用于 TCP 套接字,HttpClient 用于 HTTP。对于其他协议(protocol),您需要寻找实现异步 IO 的库。
  2. 这是不可避免的,但根据应用程序设计,可能还有优化的空间。例如如果您要发送 1GB 文件,则不需要 1GB 缓冲区,您可以使用较小的缓冲区逐 block 读取它
  3. 可以通过将 DirectByteBuffer 实例传递给 IO 方法来避免。使用异步 IO 还可以减少需要同时使用的缓冲区总数
  4. 不特定于 IO,因此适用一般内存占用优化建议
  5. 通常不应该成为问题,因为内核会自动调整它们的大小。但当然,让数千个套接字打开的时间超过必要的时间仍然会产生影响

总的来说,JVM 最终应该清理 IO 所需的 native 资源,但何时发生可能取决于依赖于这些 native 资源的 java 对象保持 Activity 状态的时间。

关于java - Java相关的Native内存是如何被清除的。我了解 GC 不会清除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57941743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com