JVM详解
jvm组成结构
java virtual Machine -> 操作系统 -> 硬件系统 jvm是运行在操作系统上的,与硬件系统没有直接交互
1.ClassLoader 类加载器
负责加载.class文件
2.Native Interface 本地接口
调用时加载到本地方法区,使用其他的语言编写,很少使用。
3.Method Area方法区
方法区是被所有线程共享,所有方法的信息都保存在这里
静态变量+常量+类信息+运行时常量池(1.6)+实例变量存储在堆中
4.Pc Register 程序计数器
每个线程都有一个程序计数器,就是一个指针,指向方法区中的字节码,由执行引擎读取下一条指令
5.Native Method Stack 本地方法栈
登记native方法,在执行引擎运行时加载native库。
堆栈详解
栈
栈也叫栈内存,主管java程序的运行。生命周期随着线程的生命周期结束,是线程私有的。基本类型的变量和引用类型的引用存储在栈中。
主要保存:
1.本地变量:输入、输出参数和方法中的局部变量
2.栈操作:出栈、入栈的操作
3.栈帧数据:包括类文件、方法等。 栈帧是一个方法和运行期数据的数据集
三种jvm
1.sun公司的HotSpot
2.BEA公司的JRockit
3.IBM公司的J9 VM
堆内存详解
|伊甸区 存放刚new出来的对象
新生区 |幸存者0区
|幸存者1区
|养老区
|永久存储区 存放jdk自带class和Interface的元数据
一、GC
对伊甸区的gc叫Minor Gc
对养老区的gc叫Full Gc,如果gc后还不能释放内存则报OutOfMemeryError:Java heap space
二、虚拟机内存不够原因(理论上默认为内存的四分之一)
1.java虚拟机的堆内存不够,通过-Xmx、-Xms参数调整
2.代码中创建了大量对象,并且长时间不能够被回收(存在引用)
三、永久区 OutOfMemeryError:PermGen space 永久代内存不够
1.jdk1.6及之前 有永久代,常量池1.6在方法区
2.jdk1.7 有永久代,但已经逐步去永久代。常量池1.7在堆
3.jdk1.8及以后 无永久代,常量池在元空间
GC算法
1.复制算法 新生代的gc算法,默认达到老年代的年龄为15 10%的空闲空间 10%的活动空间 80%的用来分配内存
2.标记清除/整理算法 老年代的gc算法