高并发学习之01JVM运行核心逻辑

标签: 架构学习之高并发编程  Java并发编程  JVM  javap 命令  idea 查看class  class文件

1. Java文件是怎么被JVM运行的

一个 .java 源代码通过编译器 编译之后变成一个**.class**字节码文件,jvm启动加载字节码文件,会在内存中大致划分两大区域 :

  1. 线程共享区域:是所有的线程都能访问的这块内存数据,随虚拟机或者GC(垃圾回收器)创建和销毁
  2. 线程独占区域:每个线程独立的空间,随线程声明周期而创建销毁

线程共享的区域分为:方法区、堆内存
线程独占区域分为:虚拟机栈、本地方法栈、程序计数器
这里在细说下:

  • 方法区
    存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等
  • Java 堆
    在Java虚拟机启动时候建立Java堆,几乎所有的对象实例都存放到Java堆中。堆内存还细分为新生代、老年代、永久代。GC主要的工作就是管理堆内存。
  • 虚拟机栈
    每个虚拟机线程都会在这个空间有个私有的栈,线程栈是由多个栈桢组成。
    一个线程Java栈在线程创建的时候被创建,Java栈中保存局部变量、方法参数。同时Java的方法调用返回值等。
    栈最大内存是1M,超出抛异常StackOverflowError
  • 本地方法栈
    本地方法栈和Java栈非常相似,最大不同为本地方法栈用于本地方法调用,Java虚拟机允许Java直接调用本地方法
  • 程序计数器
    记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法则计数器值为空。每个线程在这个空间中也有个独立的空间,占用内存很小。CPU同一时间只会执行一条线程的中指令。JVM会轮流切换并分配CPU执行,计数器就是为了记录CPU切换会当前线程时提示上次执行的位置。

2. JAVAP 查看class文件

2.1 什么是class文件

上面说了一对JVM加载class文件进行的操作,似乎class文件里面包含了很多东西。其实class文件就是包含了JAVA程序执行的字节码。它的文件开头有一个0xcafebabe(16进制)特殊标识。class文件的查看需要我们借助JDK提供的工具查看。
在说明下,在我们平常开发中使用IDE编辑后class文件是经过IDE解析class之后整理出来给我们看到的格式,并不是class原本的面貌(class就是一个二进制流,中间无任何分隔符)。

2.2 Javap命令直接 查看class文件

首先我们编写一个简单的Java文件

public class DemoOne {

    public static void main(String[] args){
        int a = 1;
        int b = 1;
        System.out.println(a + b);
    }
}

这里只是简单定义了两个参数a、b 然后输出两者之后,代码简单,运行下main方法,经过编译器编译之后,产生**.class**文件。找到class 文件目录,通过命令行输入命令 javap -v class名称:javap查看class文件
这里只是掩饰怎么查看就不截全部图片了

2.3 IDEA 查看class文件

作为一个优秀的java开发工具,idea提供了一个更简单的查看方式:

  • 打开Settings->Tools->External Tools -> +
  • 如图设置工具
  • 运行 如图:运行

3.说明

关于汇编语言指令码、和javap中对应指令码,以及javap中指令码含义这里就不细说了。
最后提供详细说明的链接地址

版权声明:本文为qq_21163061原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21163061/article/details/104934000