Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何清除与Java相关的本机内存。我知道GC不会清除它_Java_Memory Management_Jvm_Heap_Native - Fatal编程技术网

如何清除与Java相关的本机内存。我知道GC不会清除它

如何清除与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操作等待外部服务时,很多线程都在sun.misc.Unsafe.park等待。 这导致本机内存累积无法清除。
如何清除本机内存。它是否在一段时间后自动清除

使用每个连接的线程IO会导致以下内存开销:

  • 线程堆栈
  • ByteBuffer
    byte[]
    传递给读/写/发送/接收方法
  • 可能是一个反弹缓冲区(openjdk实现细节),因为系统调用需要一个固定的缓冲区,而java数据结构可以由GC移动
  • IO函数之上的附加抽象和应用程序在连接的生命周期内保持活动状态
  • 内核套接字存储器

  • 可以通过调整
    -Xss
    参数稍微调整。完整的修复需要通过非阻塞/异步IO在更少的线程上多路复用多个连接
    AsynchronousSocketChannel
    使TCP套接字易于使用,而HTTP的HttpClient则易于使用。对于其他协议,您需要查找实现异步IO的库
  • 这是不可避免的,但根据应用程序设计,可能存在优化空间。e、 如果你要发送一个1GB的文件,你不需要1GB的缓冲区,你可以用更小的缓冲区逐块读取它
  • 可以通过将
    DirectByteBuffer
    实例传递给IO方法来避免。使用异步IO还可以减少需要同时使用的缓冲区总数
  • 不特定于IO,因此一般内存占用优化建议适用
  • 一般来说,这不应该是一个问题,因为内核会自动调整它们的大小。但当然,保持数千个插座的开启时间超过必要时间仍然会产生影响

  • 总的来说,JVM最终应该清理IO所需的本机资源,但何时清理可能取决于将依赖于这些本机资源的java对象保持活动状态的时间。

    不安全。park
    不会造成本机内存占用。请澄清您的意思,最好使用代码示例和诊断工具的输出。Direct ByteBuffers注册一个对象,当ByteBuffer变得不可访问时,该对象将释放关联的本机内存。这是一个问题:虽然这是几年前的事了(Java 8时间框架),但Java的IIRC更高版本有一些改进