1.1.1 Java程序运行原理的分析

截屏2020-02-12上午10.13.55.png

class文件内容

class文件包含了java程序执行的字节码,其中的数据以二进制流的形式无分隔符严格紧凑的排列;文件开头有一个0xcafebabe(16进制)咖啡北鼻的特殊标志来表明该文件为class文件。

JVM运行时数据区

分两个部分:

  • 线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁。
    • 方法区:JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据;虚拟机规范中这是一个逻辑区划。具体实现根据不同虚拟机来实现。如oracle的hotspot在java7中方法区放在永久代,Java8放在元数据空间,并且通过GC机制对这个区域进行管理。(详细见下述)
    • 堆内存:可以细分为:老年代、新生代(Eden、From Survivor、To Survivor)JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存。如果满了会出现OutOfMemoryError,后续在内存模型中,详细讲解。
  • 线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁。
    • 虚拟机栈:每个线程在这个空间都有一个私有的空间。线程栈由多个栈帧组成。一个线程会执行一个或多个方法,一个方法对应一个栈帧。栈帧内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。栈内存默认最大是1M,超过则抛出StackOverflowError
    • 本地方法栈:和虚拟机栈类似,虚拟机栈是为了执行Java方法而准备的,本地方法栈是为了虚拟机使用Native本地方法而准备的。虚拟机规范中没有规定具体的实现,由不同的虚拟机厂商去实现。HotSpot虚拟机中虚拟机栈和本地方法栈的实现是一样的。同样超出后会抛出StackOverflowError
    • 程序计数器:用于记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空。每个线程在这个空间由一个私有的空间,占用内存空间很少。CPU同一时间,只会执行一条线程中的指令。JVM多线程会轮流切换并分配CPU执行时间的方式。为了线程切换后,需要通过程序计数器,来恢复正确的执行位置

方法区

方法区里存储着class文件的信息和动态常量池,class文件的信息包括类信息和静态常量池。 可以将类的信息是对class文件内容的一个框架,里面具体的内容通过常量池来存储。

动态常量池里的内容除了是静态常量池里的内容外,还将静态常量池里的符号引用转变为直接引用,而且动态常量池里的内容是能动态添加的。例如调用String的intern方法就能将string的值添加到String常量池中,这里String常量池是包含在动态常量池里的,但在jdk1.8后,将String常量池放到了堆中。

静态常量池和动态常量池的关系以及区别

静态常量池存储的是当class文件被java虚拟机加载进来后存放在方法区的一些字面量和符号引用,字面量包括字符串,基本类型的常量,符号引用其实引用的就是常量池里面的字符串,但符号引用不是直接存储字符串,而是存储字符串在常量池里的索引。

动态常量池是当class文件被加载完成后,java虚拟机会将静态常量池里的内容转移到动态常量池里,在静态常量池的符号引用有一部分是会被转变为直接引用的,比如说类的静态方法或私有方法,实例构造方法,父类方法,这是因为这些方法不能被重写其他版本,所以能在加载的时候就可以将符号引用转变为直接引用,而其他的一些方法是在这个方法被第一次调用的时候才会将符号引用转变为直接引用的。

方法区和常量池详细

程序完整运行分析

  1. Java源代码编译为class字节码
  2. JVM加载class文件,将信息加载到方法区
  3. JVM创建线程来执行代码,具体体现为在虚拟机栈、程序计数器内存区域中创建线程独占的空间
  4. 根据方法区中的数据,按照字节码指令顺序,在虚拟机栈该方法栈帧的本地变量表和操作数栈中不断执行,该线程的程序计数器记录当前线程执行字节码的位置。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值