当前位置: 首页 > news >正文

Java虚拟机

深入理解java虚拟机

  • java体现架构可以分为:java设计语言、java API、class文件、虚拟机
  • 一个java程序都有一个java虚拟机实例.一个java虚拟机实例有单独的堆、方法区、栈等.
  • 一个线程包含一个执行栈,一行是一个栈帧。每个执行方法对应一个栈帧,一个栈帧包含局部变量和操作数栈。操作数栈包含了一个方法中的所有执行指令。

类加载器

java平台的类加载器
  • Bootstrap ClassLoader. 引导类加载器由C++ 实现的加载器,加载Java的核心类库.
  • Extensions ClassLoader. 拓展类加载器
  • Application ClassLoader 应用程序类加载器.可以通过getSystemClassLoader获取到.
Android平台的类加载器
  • BootClassLoader. 在Zygote进程的 main方法中加载.
  • PathClassLoader 继承自 BaseDexClassLoader. 应用安装完成后,会使用此类,按照DexPathList中 dex 元素的顺序加载dex文件. 在SystemServer进程中加载.
  • DexClassLoader, 继承自 BaseDexClassLoader

双亲委派模型

  • 类装载器优先使用双亲装载器去装载类型,如果双亲装载器装载失败,那么类装载器才会尝试自己装载类.
  • 启动类装载器是根类装载器,由native方法实现.
  • 每一个类装载器都有一个唯一的命名空间,通过命名空间控制了类的访问权限.
  • 装载、连接、初始化.

内存相关

  • 方法区. 装载的类信息存放在方法区.类型、字段信息、常量池、方法信息等等
  • 堆. 分配的实例对象存放在堆中.
  • 程序计数器

知识点

  • 对象的引用指向了堆中的对象实例,对象的引用也指向了方法区中的类信息,这个类信息是对象的实际类型,是运行时的类型.
  • 数组在虚拟机中对应的类型仅与数组的类型和维度有关.
  • 在java虚拟机中出现的整数运算溢出并不会导致异常,而仅仅是简单的将溢出部分截断,以符合数据类型.

查看class文件

  • hexdump 可以查看class文件的16进制输出
  • javap -v name.class 可以查看class文件的字节码流,包括操作码
  • java class文件是二进制的码流,按照顺序解析

类加载

  • 装载、连接、初始化.
  • 连接分为:验证、准备(分配内存,初始化默认值)、解析
  • 加载子类前优先加载父类,初始化子类前优先初始化父类.
  • 只有主动使用的场景下,才会触发初始化. 用子类调用父类的非final的静态变量,并不会导致子类初始化.
  • 静态常量(final static)不会导致类的初始化.

垃圾收集算法

  • 新生代. 常用算法为复制算法. 标记有效的内存区域,复制到空白内存区, 原来的内存区域直接清除.
  • 老年代. 常用算法为标记-清除或者标记压缩算法.
  • 永生代. 类信息、静态常量等信息
Android 中常见的GC roots
  • 系统类加载器加载的对象
  • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
  • 方法区中的类静态属性引用的对象。
  • 方法区中的常量引用的对象。
  • 本地方法栈中JNI(Native方法)的引用对象。
  • 存活的线程对象
GC root和内存泄露
  • 当发生内存泄露的时候,可以根据GC roots 去找泄露的对象
http://www.jsqmd.com/news/670095/

相关文章:

  • 告别命令行!用Eclipse+WindowBuilder给Java程序做个Windows桌面“皮肤”(附exe4j打包避坑指南)
  • 3DSlicer数据保存全攻略:.mrml、.mrb、.nrrd、.nii.gz到底该存哪个?附实战避坑指南
  • 如何转换数据文件字节序_CONVERT DATAFILE用于跨OS平台数据库迁移
  • 手机号码定位工具:3分钟快速查询地理位置信息完整指南
  • 别再只盯着PN结了!用PHPStudy+Multisim带你玩转快恢复二极管(FRD)的仿真与选型
  • 在VMware里复活Windows Neptune:一个被取消的Windows XP前身的安装与体验
  • 【Anybus】网关配置教程
  • Win10更新后VMware报错?手把手教你排查‘基于虚拟化的安全性’并修复bcdedit命令无效问题
  • Qwen3.5-9B GPU算力适配教程:CUDA 12.4+Triton优化部署指南
  • FOC:【2】SVPWM(七段式)的Verilog实现与仿真
  • Syncthing同步卡住、报错怎么办?手把手教你排查inotify、版本不匹配等5个常见坑
  • PullZoomView单元测试编写指南:确保代码质量与稳定性
  • 从扫地机器人到AR眼镜:聊聊RGBD-SLAM技术落地的那些‘坑’与曙光
  • NVIDIA Profile Inspector 终极配置指南:解锁显卡隐藏性能的完整教程
  • Spring Boot项目里Druid连接池的testWhileIdle、testOnBorrow到底怎么配?一个真实线上故障复盘
  • Spring Integration 3.0 于2013年10月正式发布,是该框架的重要里程碑版本
  • nli-distilroberta-base作品展示:NLI服务嵌入低代码平台后的无代码逻辑校验界面
  • 从零构建DAC8563高精度信号源:硬件选型、SPI驱动与实战调优
  • 嵌入式诊断协议实战:从ISO15765帧解析到AUTOSAR DCM实现
  • 深入理解reFlutter核心组件:引擎哈希与快照分析原理
  • 保姆级教程:用清华镜像站5分钟搞定Anaconda3安装与环境变量配置(Windows版)
  • SpringOne2GX 2013 是由 Pivotal(当时为 VMware SpringSource)主办的年度 Spring 技术大会
  • 贝叶斯优化调参实战:如何用更少的迭代次数,让XGBoost模型效果提升10%?
  • AI读脸术入门教程:零代码实现人脸属性识别(附案例)
  • 从电路到应用:深入解析开漏、推挽与图腾柱的实战选型
  • YOLOv7全系列模型网络架构深度解析与演进图谱
  • 编程新手必看:coze-loop代码优化器保姆级使用教程
  • AGI模型窃取风险暴增317%!联邦学习中的梯度泄露如何被攻破,又该如何用动态掩码防御?
  • Youtu-VL-4B-Instruct-GGUF模型部署保姆级教程:Anaconda环境管理详解
  • Spring Web Flow 2.4 M1(里程碑版本)和 2.3.2(维护版本)于2014年左右发布