JVM原理及调优

java Virtual Machine  ==>>  java 虚拟机 

一、JDKJREJVM概念 

    由上图可以看出 

   JDK包含JRE包含JVM

   简单来说

三者联系:JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。

JVM+Lib=JRE。

总体来说就是,我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。

JVM流程

 

 类装载器ClassLoader

负责加载class文件,class文件在文件开头有特定的文件标示,
并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由
Execution Engine决定

 

 类装载器ClassLoader2

虚拟机自带的加载器
• 启动类加载器(Bootstrap)C++
• 扩展类加载器(Extension)Java
• 应用程序类加载器(AppClassLoader)
Java
也叫系统类加载器,加载当前应用的
classpath的所有类
• 用户自定义加载器
Java.lang.ClassLoader的子类,用户
可以定制类的加载方式

Execution Engine

执行引擎负责解释命令,提交操作系统执行

pc Register:寄存器:当多个线程时,记录下当前线程执行的位置,下次再回来的时候继续执行

  • 程序计数器是一块较小的内存空间,是当前线程所执行的字节码的行号指示器
  • 程序计算器处于线程独占区
  • 如果线程执行的是java方法,记录的是正在执行的虚拟机字节 码指令的地址,如果是native方法,这个计数器值为undefined

栈区 :

Stack 栈是什么
栈也叫栈内存,主管Java程序的运行,是在线程创建时
创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释
放, 对于栈来说不存在垃圾回收问题,只要线程一结束该栈就
Over,生命周期和线程一致,是线程私有的。8种基本类型的变
量+对象的引用变量+实例方法都是在函数的栈内存中分配。

栈存储什么? 
• 局部变量表:输入参数和输出参数以及方法内的变量类型;局部变量表在编译期间完成分配,当进入一个方法时,这个方法在帧中分配多少内存是固定的
• 栈操作(Operand Stack):记录出栈、入栈的操作;
• 动态链接
• 方法出口
栈溢出
StackOverflowError,OutOfMemory

堆:JVM内部最大的部分, 不安全的,共享的 超出 outofmemeryerror

 

方法区:共享

字节码指令

 

 

 

 

 

独享:PC 寄存器,本地方法区、虚拟机栈

       主内存:线程所独有的,线程安全

  工作内存:共享的内存,线程不安全的

 

 

 方法的执行其实是压栈和出栈

栈帧其实可以代表方法的执行,栈可以动态去调整大小,超出以后就会出现

  

 1、编译  将java文件编译成class文件

   编译后的class其实是二进制代码,有规则的二进制代码  以cafe babe开头

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

 (2)类加载机制
JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

 顶级父类先去加载,,永远抛给服了(好处:父类只加载一次)

 

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

原文地址:https://www.cnblogs.com/songsong003/p/11126660.html