了解非堆内存的参数配置

虚拟机还有一些内存用于方法区,线程栈和直接内存的使用。

方法区配置:
方法区主要存放类的元信息。
在JDK1.6和1.7版本中,可以使用-XX:PermSize和-XX:MaxPermSize配置永久区大小。其中-XX:PermSize表示初始的永久区大小,-XX:MaxPermSize表示最大永久区。

在JDK1.8中,永久区被彻底移除,使用了新的元数据区存放类的元数据。默认情况下,元数据区只受系统可用内存的限制,但依然可以使用参数-XX:MaxMetaspaceSize指定永久区的最大可用值

栈配置:
栈是每个线程私有的内存空间。在java虚拟机中可以使用-Xss参数指定线程的栈大小。

直接内存配置:
直接内存也是java程序中非常重要的组成部分,特别是NIO被广泛使用后,直接内存变得很普遍。直接内存跳过了java堆,使java程序可以直接访问原生堆空间,因此,从一定程度上加快了内存空间的访问速度。但是,使用直接内存一定可以提高内存访问速度也是不正确的。

最大可用直接内存可以使用参数-XX:MaxDirectMemorySize配置,如果不设置,默认值最大堆空间,即-Xmx。当直接内存使用量达到-XX:MaxDirectMemorySize时,就会触发垃圾回收,如果垃圾回收不能有效释放足够空间,也会引起系统OOM。

直接内存适合申请次数较少,访问比较频繁的场合,如果内存空间本身需要频繁申请,则并不适合使用直接内存。

虚拟机工作模式:
java虚拟机支持Client和Server两种运行模式,通过java -version查看当前运行模式:

了解非堆内存的参数配置

虚拟机在Server模式和Client模式下的各种参数可能会有很大不同,可以使用-XX:+PrintFlagsFinal查看参数默认值。

了解非堆内存的参数配置

以上是两种模式下参数的不同值。