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

浙公网安备 33010602011771号