JVM调优-内存分配基础
来源:互联网 发布:curl 发送json数据 编辑:程序博客网 时间:2024/05/18 00:55
JVM的内存分为两种
堆(Heap)和非堆(Non-heap)内存
heap区又分为:
- Eden Space(伊甸园)、
- Survivor Space(幸存者区)、
- Old Gen(老年代)。
非heap区又分:
- Code Cache(代码缓存区);
- Perm Gen(永久代);
- Jvm Stack(java虚拟机栈);
- Local Method Statck(本地方法栈);
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”
简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,
所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
堆分为年轻代和老年代、二者比例1:2 (精确)
其中年轻代又分为1个Eden 和2个Survivor 比例(大约)为8:1:1
其中Eden和Survivor 的比例不是绝对的, 但是两个Survivor区是严格的1:1
可以设置jvm参数
-Xms200m -Xmx200m
设置堆初始大小 也是最小值为200m 同时设置最大值为200m,
目的就是为了防止gc回收的过程中jvm动态改变堆的大小
通过jdk自带的工具 jmap
# jmap.exe -heap 43656 最后一个参数是进程idC:\Users\coffee\Desktop>C:\java\jdk1.8.0_121\bin\jmap.exe -heap 43656Attaching to process ID 43656, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.121-b13using thread-local object allocation.Parallel GC with 4 thread(s)Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 209715200 (200.0MB) ## 可以看到堆最大就是Xmx的大小 NewSize = 69730304 (66.5MB) ## 年轻带 (包括Eden和Survivor) MaxNewSize = 69730304 (66.5MB) OldSize = 139984896 (133.5MB) ## 老年代 NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB)Heap Usage:PS Young GenerationEden Space: capacity = 62390272 (59.5MB) used = 25711456 (24.520355224609375MB) free = 36678816 (34.979644775390625MB) 41.21068104976366% usedFrom Space: capacity = 3670016 (3.5MB) used = 1973232 (1.8818206787109375MB) free = 1696784 (1.6181793212890625MB) 53.766305106026785% usedTo Space: capacity = 3670016 (3.5MB) used = 0 (0.0MB) free = 3670016 (3.5MB) 0.0% usedPS Old Generation capacity = 139984896 (133.5MB) used = 45164904 (43.072608947753906MB) free = 94819992 (90.4273910522461MB) 32.264126552624646% used37442 interned Strings occupying 4407232 bytes.
阅读全文