JVM读后笔记

字节码

任何编译语言的编译的编译结果满足并包含JAVA虚拟机的内部指令集、符号表以及一些其他辅助信息,他就是一个有效字节码,就能被虚拟机所识别并装载运行。

字节码内部不包含任何的分隔符区分段落,所以无论字节码顺序、数量都有严格规定,所有16位、32/64位长度的数据构成2/4/8个8位字节单位表示。多字节按照Big-endian顺序(高位字节在地址最低位,低位字节在地址高位)存储。因此,一组8位字节单位的字节流组成一个完整的字节码文件。所以字节码文件来源既可以是本地文件,也可以从网络下载而来。

字节码编译


词法解析就是javac编译器执行字节码编译第一步,词法解析器将JAVA源码中的关键字和标示符等内容转换为JAVA语法规范的Token序列,然后按照指定顺序规则进行匹配校验,为后续的语法解析步骤准备。语法解析将匹配后的Token序列整合为一课结构化的抽象语法树,比如一个try语句后面接上catch或者finally字句。语义解析为语法解析步骤中所产生的语法解析树扩充的更加完善。操作步骤如下:

1.为没有构造方法的类型添加缺省的无参构造方法;

2.检查任何类型的变量在使用前是否都已经经历过初始化;

3.检查变量类型是否与值匹配;

4.将String类型的常量进行合并处理;

5.检查代码的所有操作语句是否可达;

6.异常检查;

7.解除JAVA语法糖。

经历上述四个步骤,javac将语法树编译成字节码。


JVM内存区分配


如上图所示,JVM中的内存区根据受访权限分为线程共享和线程私有,线程共享指的是允许所有线程共享访问的一类内存区,包括堆区、方法区和运行时常量池。线程私有内存区指的是不允许所有线程共享访问,只允许被所属的独立线程访问的一类内存区,包裹JAVA栈、PC寄存器和本地方法栈。

其中关注的重点是JAVA堆区JAVA栈区

JAVA堆区(heap)

JAVA堆区在JVM启动时被创建,实际的内存空间可以是不连续的,被用于存储对象实例,同时也是GC(Garbage Collocation,垃圾收集器)执行垃圾回收的重点区域。

方法区

方法区在JVM启动时被创建,实际的内存空间可以是不连续的,被用于存储每一个类的结构信息,比如常量池、字段、和方法数据、构造函数和普通方法的字节码内容以及类、实例、接口初始化时所有要的特殊方法数据。方法区可以认为设置大小,并且不像JAVA堆区频繁的被GC执行回收,甚至可以显示的指定是否需要在程序运行时执行回收方法区的数据,因此会被称为永久代(permanent generation)。

运行时常量池

运行时常量池属于方法区的一部分,是字节码文件中常量池表的运行时的表示形式。

JAVA栈

JAVA栈也被称之为JAVA虚拟机栈,属于线程私有,生命周期和线程的生命周期保持一致,JAVA栈用于存储栈帧(stack frame),栈帧存储的是局部变量表、操作数栈以及方法出口信息等。

PC寄存器

JAVA忠的PC寄存器是对物理PC寄存器的一种抽象模拟,线程私有,生命周期和线程生命周期保持一致,当前线程所执行的方法是一个JAVA方法,PC寄存器就会存储正在执行的字节码指令地址,反之如果是native方法,pc寄存器的值为空(undefined)。

本地方法栈

本地方法栈(native method stack)用于支持本地方法(native方法,比如使用C++代码编写的方法)执行。

 内存分配与垃圾回收


JVM优先在TLAB(Thread Local Allocation,本地线程分配缓冲区),在TLAB无法分配时,JVM在Eden空间中分配内存,如果Eden空间中无法分配内存时,JVM会执行Minor GC,直至可以在Eden空间中分配内存为止。

如果希望降低GC的回收频率和提升GC的回收效率,可以使用堆外存储技术,目前最常见的堆外存储利用逃逸分析技术筛选未发生逃逸对象,然后避开堆区直接在栈帧中分配内存空间。栈帧伴随方法调用而创建,伴随方法的执行结束而销毁,无需GC执行垃圾回收。

GC的作用

GC是JVM自动内存管理机制的具体实现,GC主要任务:内存动态分配和垃圾回收。当内存空间中的内存消耗达到一定阈值的时候,GC就会执行垃圾回收,回收必须精确,垃圾回收可能导致存在不连续的内存碎片。可以通过压缩回收算法消除内存碎片。

垃圾收集器

  1.串行还是并行回收

2.并发还是“stop-the- world”机制

stop-the-world:垃圾收集器会在内存回收的过程中暂停程序中所有的工作线程,直至完成内存回收后才会恢复被暂停的工作线程。目前使用的G1收集器也只是尽可能缩短暂停时间。

寄存器架构和栈式架构之间区别

指令集不同:栈式架构指令集以零地址为主。寄存器架构指令集以一地址指令、二地址指令、三地址指令为主

栈式架构优点:

1.设计和实现更简单,适用于资源受限的系统

2.避开寄存器分配难题

3.指令集更加紧凑

寄存器架构优点

1.性能优秀和执行高效

2.花费更少的指令完成一项操作


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值