jvm堆外内存

jvm的内存包含堆内存和堆外内存,所谓堆内存就是我们平常用-xms和-xmx控制的内存,而堆外内存分为几部分:

  • 元空间大小:
    元空间是用于存储类的元数据信息的区域,在JDK 8之后替代了永久代。可以通过-XX:MetaspaceSize和-XX:MaxMetaspaceSize来设置初始大小和最大大小。
    例如:-XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m
  • 线程栈:
    每个线程都有自己的栈,栈的大小可以影响到堆外内存的使用。可以通过减少应用程序创建的线程数来间接减少堆外内存的使用。
    可以通过调整线程池的大小来优化线程的使用。
    调整线程栈大小:
    线程栈的大小可以通过-Xss参数来设置,减小每个线程的栈大小可以在一定程度上减少堆外内存的消耗。
    例如:-Xss256k
  • 直接缓冲区:
    直接缓冲区是在Java NIO中使用的堆外内存,它们不受垃圾回收机制管理。可以通过-XX:MaxDirectMemorySize来限制直接缓冲区的最大总容量。
    例如:-XX:MaxDirectMemorySize=128m
  • 内存泄漏:
    内存泄漏是指程序中已分配的内存由于某种原因未能释放,导致可用内存逐渐减少。对于堆外内存来说,常见的内存泄漏场景包括未关闭的文件句柄、数据库连接、线程等资源。
    这其实是一种意外情况,一旦发现java进程占用的内存超出配置项很多,那就说明有内存泄露了。

默认值:

假设使用的是Oracle JDK 8,并且没有显式设置这些参数,那么默认值如下:

  • 线程栈大小 (-Xss):1MB
  • 直接缓冲区的最大大小 (-XX:MaxDirectMemorySize):与堆内存大小相同(例如,如果-Xmx设置为2GB,则-XX:MaxDirectMemorySize默认也为2GB)
  • 元空间的初始大小 (-XX:MetaspaceSize):16MB
  • 元空间的最大大小 (-XX:MaxMetaspaceSize):无上限

为了更好控制jvm内存,一般线上需要在启动时增加参数,例如:
java -jar -Xms1g -Xmx1g -Xss256k -XX:MaxDirectMemorySize=128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m

posted @ 2024-11-20 10:34  leecoders  阅读(115)  评论(0)    收藏  举报