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“

 

原文地址:https://www.cnblogs.com/leeego-123/p/11099883.html