JVM学习笔记二

1.3 运行时数据区

 java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机二创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。

灰色的为单独线程私有的,红色为多个线程共享的。即:

每个线程:独立包括程序计算器、栈、本地方法栈。

线程间共享:堆、堆外内存(永久代或元空间、代码缓存[JIT编译产物])

注意:一个jvm实例就是一个runtime对象,就是运行时数据区,下面就按照数据区里面的模块逐一分析,详细图例如下:

1.3.1 程序计数器

PC Register 介绍

jvm中的程序计算寄存器中,register的命名起源于CPU的寄存器,寄存器储存指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。它是很小的一块内存空间,存储下一条指令的地址;它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。既没有GC也没有OOM。

Q1:使用PC寄存器存储字节码指令地址有什么用?

答:因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。

Q2:PC寄存器为什么会被设定为线程私有?

答:CPU会不停地做任务切换,这样必然导致经常中断或恢复,为了准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。

1.3.2 虚拟机栈

  • java虚拟机栈(JAVA Virtual Machine Stack),早期也叫java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的java方法调用。是线程私有的。它的生命周期和线程一致,作用是主管java程序的运行它保存方法的局部变量、部分结果,并参与方法的调用和返回。
  • 遵循“先进后出”原则,在一个时间点上只会有一个活动的栈帧。即只有当前正在执行的方法栈帧(栈顶栈帧)是有效的,这个栈帧称为当前栈帧(Current Frame),通过-Xss 可以设置栈的最大空间
  • 一个方法就是一个栈帧,每个栈帧存储着“局部变量表”、“操作数栈”、“动态链接”、“方法返回地址”、“一些附加信息”

局部变量表

  • 定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量
  • 局部变量表建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题
  • 容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。运行期间不会改变大小

 所有的关键信息都在这张表中

Code:可以看到详细的字节码指令

LineNumberTable:字节码指令行数和java代码行数的对应关系

LocalVariableTable:展示局部变量的信息信息

  • 局部变量表最基本的存储单元是slot(变量槽),存放编译期就已经确定的8中基本类型、引用类型、returnaddress 类型 ,32位以内的类型占一个slot,64位的类型(long、double)占2个slot
  • 如果当前帧是有构造方法或实例方法创建的,那么对象的引用变量this会存放在index索引为0的位置上,其他的变量按照声明的顺序排列。
  • slot有重复利用的问题

  • 局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。

操作数栈

操作数栈在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈或出栈。主要用于保存计算过程中间结果,同时作为计算过程中变量临时的存储空间。

	public int testB(){
		int i=6;
		int j=7;
		int k =i+j;
		return k;
	}

//-----------------------javap 反编译后字节码文件

 public int testB();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=4, args_size=1
         0: bipush        6
         2: istore_1
         3: bipush        7
         5: istore_2
         6: iload_1
         7: iload_2
         8: iadd
         9: istore_3
        10: iload_3
        11: ireturn
      LineNumberTable:
        line 31: 0
        line 32: 3
        line 33: 6
        line 34: 10
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      12     0  this   Lcom/example/jvm/LocalVariableTableTest;
            3       9     1     i   I
            6       6     2     j   I
           10       2     3     k   I
}

 我们根据这个方法实际分析一下:

说明:当int取值-1~5采用iconst指令,取值-128~127采用bipush指令,取值-32768~32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令。

  1. Code:stack=2 locals=4 含义是操作数栈深度2,局部变量表长度为4
  2. bipush ireturn 是入栈操作,iload是出栈操作
  • 0:将6入栈
  • 2:将6取出来存储在局部变量表中,位置为1(0 放的是this)
  • 3:将7入栈
  • 5:将7取出来存储在局部变量表中,位置为2
  • 6:从局部变量表位置1中的变量取出来入栈
  • 7:从局部变量表位置2中的变量取出来入栈
  • 8:执行引擎通过iadd指令进行运算得到结果
  • 9:将栈中的结果取出来存储在局部变量表中,位置为3
  • 10:从局部变量表位置3中的变量取出来入栈
  • 11:返回值 (栈中的值13)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么要学JVM1、一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大的代码,解决更深层次的问题。2、JVM是迈向高级工程师、架构师的必备技能,也是高薪、高职位的不二选择。3、同时,JVM又是各大软件公司笔试、面试的重中之重,据统计,头部的30家互利网公司,均将JVM作为笔试面试的内容之一。4、JVM内容庞大、并且复杂难学,通过视频学习是最快速的学习手段。课程介绍本课程包含11个大章节,总计102课时,无论是笔试、面试,还是日常工作,可以让您游刃有余。第1章 基础入门,从JVM是什么开始讲起,理解JDK、JRE、JVM的关系,java的编译流程和执行流程,让您轻松入门。第2章 字节码文件,深入剖析字节码文件的全部组成结构,以及javap和jbe可视化反解析工具的使用。第3章 类的加载、解释、编译,本章节带你深入理解类加载器的分类、范围、双亲委托策略,自己手写类加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。第4章 内存模型,本章节涵盖JVM内存模型的全部内容,程序计数器、虚拟机栈、本地方法栈、方法区、永久代、元空间等全部内容。第5章 对象模型,本章节带你深入理解对象的创建过程、内存分配的方法、让你不再稀里糊涂。第6章 GC基础,本章节是垃圾回收的入门章节,带你了解GC回收的标准是什么,什么是可达性分析、安全点、安全区,四种引用类型的使用和区别等等。第7章 GC算法与收集器,本章节是垃圾回收的重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器的原理和使用,垃圾回收器的组合及分代收集等。第8章 GC日志详解,各种垃圾回收器的日志都是不同的,怎么样读懂各种垃圾回收日志就是本章节的内容。第9章 性能监控与故障排除,本章节实战学习jcmd、jmx、jconsul、jvisualvm、JMC、jps、jstatd、jmap、jstack、jinfo、jprofile、jhat总计12种性能监控和故障排查工具的使用。第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热的arthas调优工具,在线诊断各种JVM问题。第11章 故障排除,本章会使用实际案例讲解单点故障、高并发和垃圾回收导致的CPU过高的问题,怎样排查和解决它们。课程资料课程附带配套项目源码2个159页高清PDF理论篇课件1份89页高清PDF实战篇课件1份Unsafe源码PDF课件1份class_stats字段说明PDF文件1份jcmd Thread.print解析说明文件1份JProfiler内存工具说明文件1份字节码可视化解析工具1份GC日志可视化工具1份命令行工具cmder 1份学习方法理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。      

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值