JVM
扫盲:
1、jvm定义
JVM就是java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM有自己完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。
2、jvm作用
JVM是java字节码执行的引擎,还能优化java字节码,使之转化成效率更高的机器指令。
JVM中类的装载是由类加载器和它的子类来实现的,类加载是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。
不同的平台对应着不同的JVM,在执行字节码(class文件)时,JVM负责将每一条要执行的字节码送给解释器,解释器再将其翻译成特定平台换将的机器指令并执行,这样就实现了跨平台运行。
3、JVM工作原理
JVM在整个JDK中处于最底层,负责与操作系统的交互。操作系统装入jvm是通过JDK中的java.exe来实现的,具体步骤如下:
a、创建JVM装载环境和配置;
b、装载jvm.dll;
c、初始化jvm.dll;
d、调用JNIEnv实例装载并处理class类;
e、运行java程序
JVM模型图:
1:Class Loader 类加载器:
2:Execution Engine 执行引擎负责解释命令,提交操作系统执行:
3:Native Interface 本机接口
4:Runtime data area 运行数据区
本地库接口:是JAVA刚开发出来时,预留给和其他语言对接的接口例如C:
方法区:所有定义的方法的信息都保存在该区域,次区域是共享区间。静态变量 +常量+运行时常量池存在方法区中+实例变量存在内存中
PC Register: 程序计数器:每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码(下一个将要执行的指令码),由执行引擎读取下一条指令,是一个 非常小的内存空间,几乎可以忽略不记:(主要作用就是保证main方法中的代码的执行的顺序)
JVM的调优:
根据淘宝周志民,所说,jvm的调优(共享区域)90%是调堆,10%是方法区:
---------------------- 栈管运行,堆管存储 -------------------
一:java 堆:
> 存放对象的实例
> 垃圾收集器管理的主要区域
> 新生代(Eden区,Servior区(From space或(Survivor1)区和To Space区或(Survivor2))),年老带
Eden区和Servior区的内存比为8:1。 当扩展内存大于可用内存,抛OOM
> outofMemory
> -xmx 设置初始分配大小为,默认为物理内存的1/64
-xms 设置初始分配大小为,默认为物理内存的1/4
>永久带:用于存放JDK自身所携带的 Class,Interface 的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是几乎不会被垃圾回收器回收掉的
Jdk1.6及之前: 常量池分配在永久代
Jdk1.7: 有,但已经逐步“去永久代”
Jdk1.8及之后: 无
--------------------------------------------------------------------------------------------------------------------------------------
Minor GC ,Full GC 触发条件
Minor GC触发条件:当Eden区满时,触发Minor GC。
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)方法去空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
若年老区执行了Full GC之后发现依然无法进行对象的保存,就会产生OOM异常“OutOfMemoryError“