Java虚拟机学习笔记

举报
pangeneral1993 发表于 2022/07/22 09:16:41 2022/07/22
【摘要】 基本知识 虚拟机的好处跨平台、可移植性提供了托管环境(managed runtime)垃圾回收内存管理动态检测(数组越界、动态类型、安全权限) 虚拟机内存线程共享方法区堆区线程私有PC寄存器Java方法栈本地方法栈 java程序执行方式解释执行即时编译(Just-In-Time) Java类加载 加载过程加载。双亲委派模型:父加载器找不到时才会由当前加载器尝试加载启动类加载器(bootst...

基本知识

虚拟机的好处

  • 跨平台、可移植性
  • 提供了托管环境(managed runtime)
    • 垃圾回收
    • 内存管理
    • 动态检测(数组越界、动态类型、安全权限)

虚拟机内存

  • 线程共享
    • 方法区
    • 堆区
  • 线程私有
    • PC寄存器
    • Java方法栈
    • 本地方法栈

java程序执行方式

  • 解释执行
  • 即时编译(Just-In-Time)

Java类加载

加载过程

  • 加载。双亲委派模型:父加载器找不到时才会由当前加载器尝试加载
    • 启动类加载器(bootstrap class loader): C++实现,没有对应的java对象
    • 其他类加载器:java.lang.ClassLoader的子类
      • 扩展类加载器(extension class loader)
      • 应用类加载器(application class loader):扩展类加载器的子类
  • 链接
    • 验证:类满足虚拟机的约束条件
    • 准备
      • 为静态字段分配内存
      • 生成符号引用。实现虚方法的动态绑定的方法表
    • 解析:符号引用解析为实际引用
  • 初始化
    • static final基本类型或字符串类型字段赋值
    • 调用clinit方法,加锁保证只被执行一次

加载方式

  • 数组类:虚拟机直接生成
  • 接口、类:查找字节流,进行加载
  • 泛型:编译时直接擦除

虚拟机方法调用

方法调用指令

  • invokestatic: 静态方法调用
  • invokespecial: 私有实例方法、构造方法、super调用的方法、接口default方法
  • invokevirtual: 非私有实例方法
  • invokeinterface: 接口方法
  • invokedynamic: 动态方法

虚方法调用

  • invokevirtual和invokeinterface指令都属于虚方法调用指令
  • 动态绑定:根据调用者的动态类型,确定虚方法调用的目标方法
  • 虚方法调用如果指向final方法,便可以进行静态绑定

方法表

  • 类加载的链接阶段的准备步骤,会构造和类相关联的方法表。
  • 方法表是一个数组,每一个元素指向一个非私有的实例方法
    • 子类方法表包含父类方法表的所有方法
    • 子类方法的索引值,与它重写的父类方法的索引值相同

异常处理

基本概念

  • Throwable: 异常基类
    • Error: 程序不应捕获的异常
    • Exception: 可能需要捕获并处理的异常
      • RuntimeException
  • RuntimeException和Error是非检查异常,其他是检查异常

异常捕获

  • 构造异常时虚拟机需要访问线程的java栈帧,构建栈轨迹
  • 字节码中,每一个方法都附带一个异常表。其中的每一个条目代表一个异常处理器
  • 编译finally代码块时,Java编译器会复制finally代码块的内容,分别放在try-catch代码块所有正常执行路径以及异常执行路径的出口中。

反射

反射的应用

  • IDE根据点号动态展示字段或方法
  • Java调试器,枚举某一对象所有字段的值
  • 依赖反转

反射调用的实现

  • Method.invoke底层交给MethodAccessor来处理
  • MethodAccessor有三个实现,委派实现的底层可以是本地实现或动态实现
    • 委派实现(DelegatingMethodAccessorImpl):反射调用超过15次后,将从本地实现切换为动态实现
    • 本地实现(NativeMethodAccessorImpl):仅调用一次快于动态实现
    • 动态实现(GeneratedMethodAccessor1):运行效率快,但生成字节码慢

垃圾回收

回收算法

  • 引用计数法
  • 可达性分析

垃圾回收的三种方式

  • 清除(sweep): 会产生内存碎片(适合老年代)
  • 压缩(compact): 受压缩算法性能开销影响较大(适合老年代)
  • 复制(copy): 内存区域两等分,对空间使用效率低(适合年轻代)

虚拟机的堆划分

  • 新生代
    • Eden区
    • 两个大小相同的survivor区
  • 老年代
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。