JVM为Java虚拟机(Java Virtual Machine)
Runtime data area,运行时数据区。
包含5个区域,分别为:
method area (方法区)
heap (堆)
java stack (java栈)
native method stack (本地方法栈)
program counter register。 (程序计数器)
图示如下:

用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码等信息。
方法区是线程间共享的,当两个线程同时需要加载一个类型时,只有一个类会请求ClassLoader加载,另一个线程会等待。
虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)。
如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代。新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。
虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈。
虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。
栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(Frame Data)。
如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。
与虚拟机栈类似,只是是执行本地方法时使用的。
类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined。
栈溢出:Stackoverflow
堆溢出:Out Of Memory
堆用来存放所有的对象和数组,在堆内空间又分为年轻代和年老代。
年轻代分为伊甸区和幸存区。所有对象诞生于伊甸区,然后回收后经过幸存区。
所有对象诞生于伊甸区。
之所以使用两个幸存区,是为了在每次回收对象后,可以进行内存碎片整理。以利用更有效使用内存。
一区和二区也称为from区和to区,每次有一个区是空间是空的。但对象回收期间每个幸存区只经过一次。
非堆是JVM内在堆外部分的内存,主要包含代码缓存区、压缩类空间和元数据区。JDK1.8之前称为永久区。
离堆是操作系统内JVM之外的内存空间。java可以直接操纵jvm之外的内存空间。
jdk1.8之后,没有永久代的概念了,改成了元空间的叫法。而且官方文档上说不会再出现永久区的溢出问题,比如在使用maven进行编译时常常导致的问题。
| 参数 | 解释 | 示例 | 备注 |
| -Xms | 初始堆大小 | -Xms100m | |
| -Xmx | 最大堆设置 | -Xmx100m | |
| -Xmn | 年轻代设置 | -Xmn100m | |
| -XX:NewSize | 年轻代大小 | -XX:NewSize=100m | |
| -XX:MaxNewSize | 年轻代最大值 | -XX:MaxNewSize=100m | |
| -XX:NewRatio | 年老代是年轻代的倍数 | -XX:NewRatio=3,默认2 | |
| -XX:SurvivorRatio | 伊甸区是单个幸存区的倍数 | -XX:SurvivorRatio=1,默认6 | |
| -XX:MetaspaceSize | 元空间大小 | -XX:MetaspaceSize=1g | not work |
| -XX:MaxMetaspaceSize | 最大元空间 | -XX:MaxMetaspaceSize=2g | not work |
| -XX:CompressedClassSpaceSize | 压缩类空间 | -XX:CompressedClassSpaceSize=2g | not work |
| -Xverbosegclog | 记录gc详细日志到文件 | -Xverbosegclog:/home/1.log | WAS(Websphere application server)中使用 |
| -Xloggc | 记录gc日志 | -Xloggc:/home/1.log | JDK非标选项 |
打开:Windows+R --> jvisualvm
打开IDEA中运行程序,就能看到 jvisualvm 界面中的情况
将所有区设为100M:
-Xms400m -Xmx400m -Xmn300m -XX:SurvivorRatio=1

打开IDEA中运行程序
打开:Windows+R --> jconsole


原文:https://www.cnblogs.com/share23/p/9643094.html