分析Java程序运行原理

分析Java程序运行原理

  • 前言
  • Class文件内容及包含的java逻辑语义
    • Class文件内容:
    • Class文件内容包含哪些java逻辑语义:
  • Jvm运行时内存的数据区划分
    • 线程共享区域:
    • 线程独享区域:
  • Java程序运行原理完整分析
    • 上一个简单实操的java类从头分析其运行原理:
    • 我的专栏

前言

在分析Java程序运行原理前,我们先了解两点基础的前提知识点:

  1. class字节码文件到底存储的什么内容,以及它包含了哪些java语义逻辑内容?
  2. Jvm在运行时内存的数据区到底如何划分?

Class文件内容及包含的java逻辑语义

Class文件内容:

class文件是java编译器对.java源文件编译之后产生的字节码文件,其内容是严格按照数据格式紧凑排列无任何分隔符的二进制流数据,当我们用16进制工具查看时,会发现class文件都是以(0X cafebabe)开头。Jvm在加载class文件时,优先校验其是否有此开头标记,如没有则Jvm认为是非法的class文件,会抛ClassFormatError错误。

Class文件内容包含哪些java逻辑语义:

  1. 首先借助javap命令对class文件进行反编译
    命令:
    javap -v Demo.class > Demo.txt

  2. 打开Demo.txt会发现有四部分核心内容

    内容一:JDK的编译版本/类的访问修饰符
    在这里插入图片描述

    内容二:常量池(和字符串/运行时常量池有所区别),主要包含如类名称常量字符串、方法名常量字符串以及类中定义的常量等描述信息。
    分析Java程序运行原理_第1张图片
    内容三:构造方法
    分析Java程序运行原理_第2张图片

    内容四:方法描述包含方法的访问修饰符,本地变量数量/参数数量/操作数栈的深度,编译后的方法指令码操作符,javap反编译后得到的是操作符,实际class文件存储的是指令码。
    分析Java程序运行原理_第3张图片

Jvm运行时内存的数据区划分

线程共享区域:

方法区:主要存储类信息,常量信息(字符串常量/运行时常量)。以HotSpot虚拟机为例,JDK1.7及之前用永久代实现方法区,JDK1.8使用元数据空间及系统内存实现方法区。JDK1.7开始将字符串/运行时常量池实际的物理存储移入堆内存,逻辑上常量池依然可看做是方法区一部分。
堆内存:主要储存类的对象信息,GC主要的工作区域。

线程独享区域:

程序计数器:主要记录程序运行的字节码位置,存储的是字节码指令地址。
虚拟机栈:主要存储线程中方法运行时所产生的局部变量表,操作数栈,返回值地址以及其他附属信息等。单个线程栈默认1M大小。
本地方法栈:和虚拟机栈作用类似,主要是Jvm为native方法运行准备。

Java程序运行原理完整分析

知道了class文件内容和包含的java逻辑语义,以及JVM运行时的数据区划分之后,下面理解java程序运行原理就会很轻松愉快。

上一个简单实操的java类从头分析其运行原理:

1. 编写Demo.java源文件
分析Java程序运行原理_第4张图片

2. Javac 编译源代码产生Demo.class
分析Java程序运行原理_第5张图片

3. Javap 命令反编译Demo.class文件,得到Demo.txt
分析Java程序运行原理_第6张图片

4. 打开Demo.txt 找到其中main方法的描述
分析Java程序运行原理_第7张图片

5. Demo.class执行流程梳理

  1. 先编写源代码Demo.java
  2. 编译产生Demo.class
  3. Jvm加载Demo.class进内存(类加载过程后续文章讲解)
  4. 首先在方法区存储Demo类信息
  5. 其次在堆内存创建Demo的对象信息
  6. Jvm开启线程执行main方法
  7. 在程序计数器和虚拟机栈为执行线程分配对应空间
  8. Jvm执行引擎按照main方法中的指令码依次操作栈帧中的操作数栈和本地变量表执行程序,同时程序计数器记录每次执行的字节码指令位置。

以上就是我对java程序运行原理的理解分析,希望对你有帮助,感谢阅读。


我的专栏

  1. 设计模式
  2. 认证授权框架实战
  3. java进阶知识
  4. maven进阶知
  5. spring进阶知识

你可能感兴趣的:(java进阶知识,java)