• 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及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

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

     

     

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

  • 相关阅读:
    金融学习--外汇储备信息
    odoo开发笔记 -- 跨域Refused to display in a frame because it set 'X-Frame-Options' to 'DENY'
    odoo开发笔记--ValueError Expected singleton
    chartjs
    在线海报设计
    odoo开发笔记--日期or时间字段给定默认值
    odoo开发笔记--form视图按钮样例
    python离线包下载地址
    odoo开发笔记--定时任务源码分析
    运维笔记--linux下忘记mysql root密码
  • 原文地址:https://www.cnblogs.com/songsong003/p/11126660.html
Copyright © 2020-2023  润新知