• jvm系列


    一、jvm理论

    1.1、jvm理论-总述

    1.2、jvm理论-class文件

    1.2.1、jvm理论-常量池-string

    1.2.2、jvm理论-常量池-8种基本类型

    1.3、jvm理论-字节码指令

    1.4、jvm理论-字节码指令案例

    1.5、jvm理论-虚拟机类加载

    1.6、java理论之运行时数据区

     

    二、jvm工具

    2.1、java工具总述

    三、jvm实战

    3.1、jvm调优实战 

    java虚拟机是什么

    “java虚拟机”可能指以下三种东西:
    1)、抽象规范;
    2)、一个具体的实现;
    3)、一个运行中的虚拟机实例;

    java虚拟机生命周期

    启动
    当启动一个java程序时,一个虚拟机实例诞生。
    虚拟机实例通过调用某个初始类的public static void main(String[] args)方法来运行一个java程序。
    任何拥有这样一个main方法的类都可以作为java程序运行的起点,所以必须要告诉虚拟机初始类的名称,整个程序将从它的main方法开始运行。

    消亡
    初始类的main方法作为程序初始线程的起点,任何其他线程都是由初始线程启动。
    java虚拟机内部有两种线程:守护线程和非守护线程。
    守护线程,通常是虚拟机使用的线程,如执行垃圾收集。java程序也可以把创建的线程标记为守护线程。
    非守护线程,java中的初始线程,就是开始于main方法的线程是非守护线程。
    只要程序中有非守护线程在运行,那么java程序也在继续运行(虚拟机仍然存活),当程序中所有的非守护线程都终止时,虚拟机实例自动退出
    程序本身也可以通过Runtime类或System类的exit()方法退出。

    java虚拟机体系结构

    类装载子系统
    1)、负责查找并装载类型,分成装载、连接和初始化,在java类型生命周期中有详细说明;
    2)、有两种类装载器:启动类装载器和用户自定义类装载器;
    用户自定义类装载器必须派生自java.lang.ClassLoader类。

    运行时数据区

    方法区
    被装载类型的信息存储在方法区中,详细如下:
    基本信息
    1)、类型的全限定名;
    2)、类型的直接超类的全限定名;
    3)、类型是类类型还是接口类型;
    4)、类型的访问修饰符;
    5)、直接超接口的全限定名;

    其他信息
    1)、类型的常量池;
    2)、字段信息;
    3)、方法信息;
    4)、除了常量以为的所有静态变量;
    5)、一个到ClassLoader类的引用;
    6)、一个到Class类的引用;


    1)、运行时创建的所有类实例和数组都放在堆中;
    2)、一个java虚拟机实例只存在一个堆空间,因此虚拟机中的所有线程都共享这个堆
    3)、一个java程序独占一个java虚拟机实例,因此每个java程序都有他自己的堆空间

    java栈

    1)、每启动一个新线程时,java虚拟机都会为他分配一个java栈;
    2)、java栈以帧为单位保存线程的运行状态;
    3)、java虚拟机对java栈只执行两种操作:压栈和出栈;
    4)、压栈:每当线程调用一个java方法时,虚拟机都会在该线程的java栈中压入一个新帧。使用这个帧来存储参数、局部变量、中间运算结果等;
    5)、出栈:当java方法通过return正常返回,或通过抛出异常中止,虚拟机都会将当前帧弹出java栈然后释放掉;
    6)、栈数据是线程私有的,所以不需要考虑多线程情况下栈数据的访问同步问题;

    栈帧
    1)、栈帧由三部分组成:局部变量区、操作数区和栈数据区;

    PC寄存器
    1)、对于运行中的java程序,每个线程都有自己的pc寄存器;
    2)、线程启动时创建;
    3)、当线程执行某个java方法时,PC寄存器的内容总是下一条将被执行指令的地址。

    本地方法栈
    1)、任何本地方法接口都会使用本地方法栈;

    执行引擎
    1)、执行引擎是java虚拟机实现的核心;
    2)、“执行引擎”可以有三种理解:
      a)、一个是抽象的规范;
          b)、一个是具体的实现;
          c)、一个是正在运行的实例;
    3)、执行引擎的行为使用指令集来定义。对于每条指令,规范都规定了执行该指令时应该处理什么,如果处理不做规定;

    主要的三块

      

      

    参考:

     整理自《深入Java虚拟机第二版》

    http://rednaxelafx.iteye.com/blog/774673

    http://icyfenix.iteye.com/

    java语言和java虚拟机规范:http://docs.oracle.com/javase/specs/

    https://www.zhihu.com/question/29884421/answer/113785601

  • 相关阅读:
    【转】 springBoot(5)---单元测试,全局异常
    【转】 springBoot(4)---热部署,配置文件使用
    【转】 springBoot(3)---目录结构,文件上传
    【转】 springBoot(2)---快速创建项目,初解jackson
    【转】 springBoot(1)---springboot初步理解
    【转】 SpringBoot+MyBatis+MySQL读写分离
    简单请求 vs 非简单请求
    H5新增的API
    图片
    vue更新dom的diff算法
  • 原文地址:https://www.cnblogs.com/tenghoo/p/jvm.html
Copyright © 2020-2023  润新知