如何清除与Java相关的本机内存。我知道GC不会清除它
似乎当IO操作等待外部服务时,很多线程都在sun.misc.Unsafe.park等待。 这导致本机内存累积无法清除。如何清除与Java相关的本机内存。我知道GC不会清除它,java,memory-management,jvm,heap,native,Java,Memory Management,Jvm,Heap,Native,似乎当IO操作等待外部服务时,很多线程都在sun.misc.Unsafe.park等待。 这导致本机内存累积无法清除。 如何清除本机内存。它是否在一段时间后自动清除使用每个连接的线程IO会导致以下内存开销: 线程堆栈 ByteBuffer或byte[]传递给读/写/发送/接收方法 可能是一个反弹缓冲区(openjdk实现细节),因为系统调用需要一个固定的缓冲区,而java数据结构可以由GC移动 IO函数之上的附加抽象和应用程序在连接的生命周期内保持活动状态 内核套接字存储器 可以通过调整-Xs
如何清除本机内存。它是否在一段时间后自动清除使用每个连接的线程IO会导致以下内存开销:
ByteBuffer
或byte[]
传递给读/写/发送/接收方法-Xss
参数稍微调整。完整的修复需要通过非阻塞/异步IO在更少的线程上多路复用多个连接AsynchronousSocketChannel
使TCP套接字易于使用,而HTTP的HttpClient则易于使用。对于其他协议,您需要查找实现异步IO的库DirectByteBuffer
实例传递给IO方法来避免。使用异步IO还可以减少需要同时使用的缓冲区总数总的来说,JVM最终应该清理IO所需的本机资源,但何时清理可能取决于将依赖于这些本机资源的java对象保持活动状态的时间。
不安全。park
不会造成本机内存占用。请澄清您的意思,最好使用代码示例和诊断工具的输出。Direct ByteBuffers注册一个对象,当ByteBuffer变得不可访问时,该对象将释放关联的本机内存。这是一个问题:虽然这是几年前的事了(Java 8时间框架),但Java的IIRC更高版本有一些改进