avatar
文章
491
标签
109
分类
29
首页
归档
分类
标签
关于
xhj的博客
首页
归档
分类
标签
关于

xhj的博客

虚拟机字节码执行引擎_01
发表于2023-04-01|JavaJVM
方法调用Java 的方法的执行分为两个部分: 方法调用:确定被调用的方法是哪一个; 基于栈的解释执行:真正的执行方法的字节码。 在本节中我们将对方法调用进行详细的讲解,我们知道,一切方法的调用在 Class 文件中存储的都是常量池中的符号引用,而不是方法实际运行时的入口地址(直接引用),直到类加载的时候,甚至是实际运行的时候才回去会去确定要被运行的方法的直接引用,而确定要被运行的方法的直接引用的过程就叫做方法调用。 方法调用 方法调用字节码指令 解析调用 分派调用 静态分派(方法重载) 变量的静态类型和实际类型 重载方法匹配优先级,例如一个字符 ‘a’ 作为入参 动态分派(方法重写) 动态分派的过程 动态分派的实现 单分派与多分派 动态类型语言支持 java.lang.invoke 包 MethodHandle 的使用 MethodHandle 和 Reflection 的区别 invokedynamic 指令 方法调用字节码指令Java 虚拟机提供了 5 个职责不同的方法调用字节码指令: invokestatic:调用静态方法; invokes...
虚拟机字节码执行引擎_00
发表于2023-03-24|JavaJVM
虚拟机栈栈帧结构 虚拟机栈栈帧结构 局部变量表 局部变量表的空间分配 Slot 的复用 操作数栈 动态连接 方法返回地址 局部变量表 存放方法参数和方法内部定义的局部变量; Java 程序编译为 class 文件时,就确定了每个方法需要分配的局部变量表的最大容量。 最小单位:Slot; 一个 Slot 中可以存放:boolean,byte,char,short,int,float,reference,returnAddress (少见); 虚拟机可通过局部变量表中的 reference 做到: 查找 Java 堆中的实例对象的起始地址; 查找方法区中的 Class 对象。 局部变量表的空间分配 Slot 的复用定义: 如果当前位置已经超过某个变量的作用域时,例如出了定义这个变量的代码块,这个变量对应的 Slot 就可以给其他变量使用了。但同时也说明,只要其他变量没有使用这部分 Slot 区域,这个变量就还保存在那里,这会对 GC 操作产生影响。 对 GC 操作的影响: 1 2 3 4 5 6 public static void main...
虚拟机的类加载机制
发表于2023-03-15|JavaJVM
虚拟机的类加载机制 虚拟机的类加载机制 类加载的时机 类的显式加载和隐式加载 类加载的过程 类的生命周期 加载 加载的 3 个阶段 分类 验证 准备 解析 初始化 类加载器 如何判断两个类 “相等” 类加载器的分类 双亲委派模型 类加载的时机JVM 会在程序第一次主动引用类的时候,加载该类,被动引用时并不会引发类加载的操作。也就是说,JVM 并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。那么什么是主动引用,什么是被动引用呢? 主动引用 遇到 new、getstatic、putstatic、invokestatic 字节码指令,例如: 使用 new 实例化对象; 读取或设置一个类的 static 字段(被 final 修饰的除外); 调用类的静态方法。 对类进行反射调用; 初始化一个类时,其父类还没初始化(需先初始化父类); 这点类与接口具有不同的表现,接口初始化时,不要求其父接口完成初始化,只有真正使用父接口时才初始化,如引用父接口中定义的常量。 虚拟机启动,先初始化包含 main() 函数的主...
Class文件的组成结构
发表于2023-03-01|JavaJVM
Class 文件的组成结构Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件中,中间没有任何分隔符。Java 虚拟机规范规定 Class 文件采用一种类似 C 语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表,我们之后也主要对这两种类型的数据类型进行解析。 无符号数: 无符号数属于基本数据类型,以 u1、u2、u4、u8 分别代表 1 个字节、2 个字节、4 个字节和 8 个字节的无符号数,可以用它来描述数字、索引引用、数量值或 utf-8 编码的字符串值。 表: 表是由多个无符号数或其他表为数据项构成的复合数据类型,名称上都以 _info 结尾。 Class 文件的头 8 个字节Class 文件的头 8 个字节是魔数和版本号,其中头 4 个字节是魔数,也就是 0xCAFEBABE,它可以用来确定这个文件是否为一个能被虚拟机接受的 Class 文件(这通过扩展名来识别文件类型要安全,毕竟扩展名是可以随便修改的)。 后 4 个字节则是当前 Class 文件的版本号,其中第 5、6 个字节是次版...
Java内存分配策略
发表于2023-02-26|JavaJVM
Java 内存分配策略 Java 内存分配策略 优先在 Eden 区分配 大对象直接进入老年代 长期存活的对象将进入老年代 空间分配担保 新生代和老年代的 GC 操作 新生代 GC 操作:Minor GC 发生的非常频繁,速度较块。 老年代 GC 操作:Full GC / Major GC 经常伴随着至少一次的 Minor GC; 速度一般比 Minor GC 慢上 10 倍以上。 优先在 Eden 区分配 Eden 空间不够将会触发一次 Minor GC; 虚拟机参数: -Xmx:Java 堆的最大值; -Xms:Java 堆的最小值; -Xmn:新生代大小; -XX:SurvivorRatio=8:Eden 区 / Survivor 区 = 8 : 1 大对象直接进入老年代 大对象定义: 需要大量连续内存空间的 Java 对象。例如那种很长的字符串或者数组。 设置对象直接进入老年代大小限制: -XX:PretenureSizeThreshold:单位是字节; 只对 Serial 和 ParNew 两款收集器有效。 ...
垃圾收集 (GC)
发表于2023-02-15|JavaJVM
垃圾收集 (GC)垃圾收集(Garbage Collection,GC),它的任务是解决以下 3 件问题: 哪些内存需要回收? 什么时候回收? 如何回收? 其中第一个问题很好回答,在 Java 中,GC 主要发生在 Java 堆和方法区中,对于后两个问题,我们将在之后的内容中进行讨论,并介绍 HotSpot 的 7 个垃圾收集器。 垃圾收集 (GC) 判断对象的生死 判断对象是否可用的算法 引用计数算法 可达性分析算法(主流) 四种引用类型 宣告对象死亡的两次标记过程 方法区的回收 垃圾收集算法 基础:标记 - 清除算法 解决效率问题:复制算法 解决空间碎片问题:标记 - 整理算法 进化:分代收集算法 HotSpot 中 GC 算法的实现 7 个垃圾收集器 Serial / ParNew 搭配 Serial Old 收集器 Parallel 搭配 Parallel Scavenge 收集器 CMS 收集器 G1 收集器 GC 日志解读 判断对象的生死 什么时候回收对象?当然是这个对象再也不会被用到的时候回收。所以要想解决 “什么时候回收?” ...
OOM异常
发表于2023-02-05|JavaJVM
OOM 异常 (OutOfMemoryError) OOM 异常 (OutOfMemoryError) Java 堆溢出 Java 虚拟机栈和本地方法栈溢出 方法区和运行时常量池溢出 直接内存溢出 Java 堆溢出 出现标志:java.lang.OutOfMemoryError: Java heap space 解决方法: 先通过内存映像分析工具分析 Dump 出来的堆转储快照,确认内存中的对象是否是必要的,即分清楚是出现了内存泄漏还是内存溢出; 如果是内存泄漏,通过工具查看泄漏对象到 GC Root 的引用链,定位出泄漏的位置; 如果不存在泄漏,检查虚拟机堆参数(-Xmx 和 -Xms)是否可以调大,检查代码中是否有哪些对象的生命周期过长,尝试减少程序运行期的内存消耗。 虚拟机参数: -XX:HeapDumpOnOutOfMemoryError:让虚拟机在出现内存泄漏异常时 Dump 出当前的内存堆转储快照用于事后分析。 Java 虚拟机栈和本地方法栈溢出 单线程下,栈帧过大、虚拟机容量过小都不会导致 OutOfMemoryError,只会导致 StackOve...
Java内存区域详解
发表于2023-01-31|JavaJVM
Java 内存区域详解 Java 内存区域详解 JVM 运行时的数据区域 程序计数器 Java 虚拟机栈 本地方法栈 Java 堆 方法区 直接内存 HotSpot 虚拟机堆中的对象 对象的创建(遇到一条 new 指令时) 对象的内存布局 对象的访问 句柄访问 直接指针访问 JVM 运行时的数据区域首先获取一个直观的认识: 总共也就这么 5 个区(直接内存不属于 JVM 运行时数据区的一部分),除了程序计数器其他的地方都有可能出现 OOM (OutOfMemoryError),其中像是程序计数器和两个栈(Java 虚拟机栈 & 本地方法栈)都是每个线程要有一个的,所以肯定是线程隔离的。而其他 2 个区就是线程共享的了,也就是说,如果有多个线程要同时访问这两个区的数据,是会出现线程安全问题的。接下来,我们将对这些区域进行详细的介绍。 程序计数器 当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来确定下一条要执行的字节码指令的位置 执行 Java 方法和 native 方法时的区别: 执行 Java 方法时:记录虚拟机正在执...
Java多线程基础
发表于2023-01-12|JavaJUC
Java多线程基础 一、线程介绍 1、简单案例引入 2、start和run方法区别 3、线程生命周期 4、银行排队业务案例 二、深入理解Thread构造函数 12345- [1、线程的默认命名](#1线程的默认命名)- [2、线程的父子关系](#2线程的父子关系)- [3、Thread和ThreadGroup](#3thread和threadgroup)- [4、Thread和JVM虚拟机栈](#4thread和jvm虚拟机栈)- [5、守护线程](#5守护线程) 三、Thread API的详细内容 1、线程sleep 2、线程yield 3、设置线程的优先级 4、获取线程ID 5、获取当前线程 6、设置线程上下文类加载器 7、线程interrupt 8、线程join 9、关闭线程 四、线程安全与数据同步 五、线程间通信 六、ThreadGroup详细讲解 一、线程介绍1、简单案例引入 模拟同时从数据库中读取数据和写入文件; 模拟同时从数据库中读取数据和写入文件,这两个操作作为两个线程同时进行,不需要相互的等待; 这里使用的是匿名类创建的线程,重写了Th...
MYSQL高级
发表于2022-12-31|Database
MYSQL高级 一、Mysql的架构介绍 二、索引优化分析 三、查询截取分析 四、主从复制 五、Mysql锁机制 一、Mysql的架构介绍1、Mysql在Linux下的基本安装配置1)、查看是否已经安装好 2)、Mysql的启动和停止 1 2 3 4 5 service mysql start # 启动 service mysql stop # 停止 # 另外一种启动停止的方式 /etc/init.d/mysql start /etc/init.d/mysql stop 3)、在Linux下配置Mysql的密码方式一(在mysql系统之外):在mysql系统外: 1 2 mysqladmin -u root -p password "test123" Enter password: 【输入原来的密码】 方式二(登录mysql): 1 2 3 4 5 6 mysql -u root -p Enter password: 【输入原来的密码】 mysql>use mysql; mysql> upda...
1…424344…50
avatar
xhj
相关学习笔记
文章
491
标签
109
分类
29
Follow Me
公告
欢迎来到我的博客
最新文章
Multi-Agent2026-06-03
Multi-Agent vs Single-Agent2026-06-02
Harness Engineering2026-06-01
25-架构模式总结2026-05-25
24-Skill-Plugin开发实战2026-05-24
分类
  • AI Agent40
  • Algorithm20
  • Backend Dev74
  • Big Data2
  • C/C++2
  • Claude Code71
  • Computer Basics18
  • Computer Network2
标签
Netty PyG Stacking Pandas Neural Networks PCA Maven Tornado PCV RabbitMQ Claude Code Heap Memory Tree dijkstra Redis GAT MySQL Computer Basics JVM Architecture Linear Regression List Kruskal Algorithm Object Identification Message Queue Gradient descent HBOS LOF Grid search OSI Embedding OLSE Prim NMF DataFrame AI Agent Kafka GNN Thread Compilation
归档
  • 六月 2026 3
  • 五月 2026 25
  • 四月 2026 16
  • 三月 2026 20
  • 二月 2026 10
  • 一月 2026 22
  • 十二月 2025 15
  • 十一月 2025 19
网站信息
文章数目 :
491
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2025 - 2026 By xhj框架 Hexo 8.1.2|主题 Butterfly 5.5.4