-
jvm存储模型:堆,栈,方法区....
-
jvm各区域内存:调配控制
-
jvm内存的动态分配,回收, (对象的创建,垃圾回收gc)
-
jvm性能监测工具: jconsole, jvisualvm, jmap (gc监测工具:jstat)
JVM (Java Virtual Machine, 它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的, 分为JVM指令系统 ,JVM垃圾回收机制, JVM运行时数据区-内存模型)
JVM内存的各区域作用
1) 方法区
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码等信息。方法区是线程间共享的,当两个线程同时需要加载一个类型时,只有一个类会请求ClassLoader加载,另一个线程会等待。
2) 堆区
虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)。如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代。新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。
3)栈区
虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。
栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(Frame Data)。
如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。
4)本地方法栈
与虚拟机栈类似,只是是执行本地方法时使用的。
5) 程序寄存器
类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined
JVM内存分配过程
JVM堆内存: 调配
( -Xms400m -Xmx400m -XX:NewSize=300m -XX:MaxNewSize=300m -XX:NewRatio=1
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:+UseConcMarkSweepGc
-XX:+UseG1GC )
堆:总内存大小 | -Xms400m: 最小值400m | -Xmx400: 最大值400m | |
old区 | |||
young区 | -XX:NewSize=300m 初始值300m | -XX:MaxNewSize=300m 最大值300m | |
eden区 | -XX:NewRatio=1 伊甸区/单个survivor区大小的比例 | ||
survivor-from区 | |||
survivor-to 区 |
JVM垃圾回收算法
JVM性能监测工具
(-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs )
启动一个java进程: 一个死循环
查看系统进程
启动jconsole: jconsole
启动jvisualvm: jvisualvm
使用jmap -heap 查看jvm的某进程状态
使用jstat -gc 查看gc状态