堆内存(Heap):包含新生代和老年代,新生代被分为Eden区和两个Survivor区。
非堆内存(Non-Heap):非堆内存包含:
1.Thread Stacks:所有运行的线程的空间。可以使用 -Xss 参数设置每个线程栈的大小;
2.Metaspace:元空间,用来实现方法区,可以通过设置 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 参数设置 Metaspace 大小;
3.Code Cache:用来保存由JIT(即时编译器)产生的native code 的内存区域,CodeCache 是用来保存由JIT 产生的native code 的内存区域,它是独立于JVM heap的非堆内存。即时编译是指在运行时,把频繁执行的 bytecode 转换成操作系统相关的机器码,这样程序执行时就不需要解释执行,可以提高程序性能。可通过参数-XX:ReservedCodeCacheSize设置CodeCache的大小,或者使用 -XX:+UseCodeCacheFlushing参数在CodeCache在接近满时,释放一半Cache。关于即时编译后面再做详细分析。
4.Compressed Class Space:使用XX:CompressedClassSpaceSize来设置压缩类空间的最大内存;
5.Direct NIO Buffers:NIO所使用的直接内存,既参数MaxDirectMemorySize所指定的值。
参考资料
1.《深入理解Java虚拟机:JVM高级特性与最佳实践》(第2版);
2.The Java Virtual Machine Specification Java SE 7 Edition;
3.The Java Virtual Machine Specification Java SE 8 Edition;
4.Java HotSpot Virtual Machine Garbage Collection Tuning Guide Release 8;
5.Command-line options for JDK 7 and earlier releases;
6.Java Platform Standard Edition Tools Reference。