堆和JHSDBG工具和内存溢出
JVM运行内存的整体流程
JVM 在操作系统上启动,申请内存,先进行运行时数据区的初始化,然后把类加载到方法区,最后执行方法。
方法的执行和退出过程在内存上的体现上就是虚拟机栈中栈帧的入栈和出栈。
同时在方法的执行过程中创建的对象一般情况下都是放在堆中,最后堆中的对象也是需要进行垃圾回收清理的。
步骤分析
首先启动项目时设置jvm参数**-Xms30m -Xmx30m -Xss1m
-XX:MaxMetaspaceSize=30m** 意思分别是 初始堆内存,最大堆内存,栈大小,元空间最大值。
- JVM 向操作系统申请内存:JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终止地 址分配给 JVM,接下来 JVM 就进行内部分配。
- 运行时数据库内存分配:JVM 获得内存空间后,会根据配置参数分配堆、栈以及方法区的内存大小。
- 类加载(类加载的细节后续章节会讲): 这里主要是把 class 放入方法区、还有 class 中的静态变量和常量也要放入方法区。
- 执行方法及创建对象: 启动 main 线程,执行 main 方法