JVM调优-内存分配基础

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调优-内存分配基础_第1张图片
可以设置jvm参数
-Xms200m -Xmx200m
设置堆初始大小 也是最小值为200m 同时设置最大值为200m,
目的就是为了防止gc回收的过程中jvm动态改变堆的大小
通过jdk自带的工具 jmap

# jmap.exe -heap 43656 最后一个参数是进程id
C:\Users\coffee\Desktop>C:\java\jdk1.8.0_121\bin\jmap.exe -heap 43656
Attaching to process ID 43656, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13

using 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 Generation
Eden Space:
   capacity = 62390272 (59.5MB)
   used     = 25711456 (24.520355224609375MB)
   free     = 36678816 (34.979644775390625MB)
   41.21068104976366% used
From Space:
   capacity = 3670016 (3.5MB)
   used     = 1973232 (1.8818206787109375MB)
   free     = 1696784 (1.6181793212890625MB)
   53.766305106026785% used
To Space:
   capacity = 3670016 (3.5MB)
   used     = 0 (0.0MB)
   free     = 3670016 (3.5MB)
   0.0% used
PS Old Generation
   capacity = 139984896 (133.5MB)
   used     = 45164904 (43.072608947753906MB)
   free     = 94819992 (90.4273910522461MB)
   32.264126552624646% used

37442 interned Strings occupying 4407232 bytes.

你可能感兴趣的:(JVM,JVM调优)