《深入理解Java虚拟机》读书笔记

多元相关性分析_PAST:最简便易用的统计学分析软件教程目录 欢迎来到PAST的世界!本教程并不是将PAST的所有功能均进行详细介绍,而只是挑选与生物、医学、微生物研究相关的统计学分析内容进行讲述。根据PAST内各项分析的标签分类,将该教程具体设置如下:PAST软件介绍PAST的基本信息数据的输入和修改数据的转换和标准化图像绘制 (Plot标签)点线图和直方图散点图条形图和箱须图饼图堆叠条形图三元相图气泡图单变量统计学分析 (Univariate标... 阅读详情

第一章 略

第二章 Java内存区域和内存溢出异常

运行时数据区域
  • 程序计数器
  • Java虚拟机栈
  • 本地方法栈
  • Java堆
  • 方法区
  • 运行时常量池(方法区的一部分)
  • 直接内存(并不属于数据区域,只是方便讲解)

这里写图片描述

程序计数器:

当前线程所执行的字节码的行号指示器
对于多线程来讲,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。

Java虚拟机栈:

Java方法执行的内存模型,存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈和出栈的过程。

本地方法栈

为虚拟机使用到的Native方法服务,而虚拟机栈为虚拟机执行Java方法(也就是字节码)服务

Java堆

内存中最大的一块。存放对象实例,而且是垃圾收集器管理的主要区域。

方法区

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

运行时常量池

方法区的一部分,用于存放编译期生成的各种字面量和符号引用。

对象创建的过程
  1. 类加载检查
  2. 分配内存,并将内存空间初始化为零值
  3. 对象设置,例如对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等
  4. 执行init方法
OutOfMemoryError异常
  1. Java堆溢出:Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制会就会产生内存溢出异常
  2. 虚拟机栈和本地方法栈溢出
  3. 方法区和运行时常量池溢出:经常动态生成大量Class,比如cglib,大量jsp或动态产生jsp文件等
  4. 本机直接内存溢出

第三章 垃圾回收器与内存分配策略

概述:GC关注的主要是Java堆和方法区的内存
引用计数算法

主流虚拟机不选用该方法来管理内存。

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。
缺点:很难解决对象之间相互循环引用的问题。

可达性分析算法

定义:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链时,则证明此对象是不可用的。

GC Roots的对象包括以下几种:
1. 虚拟机栈(栈帧中的本地变量表)中引用的对象。
2. 方法区中类静态属性引用的对象
3. 方法区中常量引用的对象
4. 本地方法栈中JNI(即一般说的Native方法)引用的对象

方法区的主要回收两部分内容:废弃常量和无用的类

垃圾收集方法
  1. 标记-清理算法
  2. 复制算法:Eden和Survivor比例为8:1
  3. 标记-整理算法
  4. 分代收集算法:新生代使用复制算法,老生代使用标记-清理或者标记-整理算法
垃圾收集器:CMS和G1
回收策略
  1. Minor GC和Major GC的区别:前者发生在新生代,后者发生在老生代
  2. 大对象(很长的字符串以及数组)直接进入老生代
  3. 长期存活的对象将进入老生代
  4. 动态对象年龄判定
  5. 空间分配担保

第四章 虚拟机性能监控与故障处理工具

JDK主要命令行监控工具:
  • jps:显示指定系统内所有的HotSpot虚拟机进程
  • jstat:用于收集HotSpot虚拟机各方面的运行数据
  • jinfo:显示虚拟机配置信息
  • jmap:生成虚拟机内存转储快照(headdump文件)
  • jhat:用于分析headdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
  • jstack:显示虚拟机的线程快照
JDK可视化工具
  • JConsole:基于JMX的可视化监视、管理工具
  • VisualVM:多合一故障处理工具

第五章 调优案例分析与实战

略

第六章 类文件结构

Class类文件的结构

两种数据类型:
- 无符号数:用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值
- 表:由多个无符号数或者其他表作为数据项构成的复合数据类型,以”_info”结尾

Class文件
- 前4个字节:0xCAFEBABE
- 第5和第6个字节:次版本号
- 第7和第8个字节是主版本号
- 常量池
- 访问标志:用于识别一些类或者接口层次的访问信息
- 类索引、父类索引与接口索引集合
- 字段表集合:用于描述接口或者类中声明的变量
- 方法表集合
- 属性表集合(Class文件、字段表、方法表中都可以携带)

常量池主要存放两大类常量:
1. 字面量
- 文本字符串
- 声明为final的常量值
2. 符号引用
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符

字节码指令

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Oprands)而构成。

注意:大部分的指令没有支持整数类型byte、char和short,和boolean,编译期会在编译期或运行期将byte和short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为相应的int类型数据。

第七章 虚拟机类加载机制

概念:

类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型

注意:类型的加载、连接和初始化过程都是在程序运行期间完成的。

类的生命周期:总共7个阶段,如图

这里写图片描述

必须立即对类进行初始化的有且仅有的5种情况:
1. 使用new实例化对象、读取或设置一个类的静态字段、调用一个类的静态方法
2. 对类进行反射调用
3. 当初始化一个类的时候,其父类还没被初始化的时候
4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类)
5. 当使用JDK 1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化

类加载的过程:
  1. 加载
    • 通过一个类的全限定名来获取定义此类的二进制字节流
    • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
    • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
  2. 验证
    • 文件格式验证
    • 元数据验证
    • 字节码验证
    • 符号引用验证
  3. 准备:正式为类变量分配内存并设置类变量初始值的阶段,内存都将在方法区中进行分配
  4. 解析:虚拟机将常量池内的符号引用替换为直接引用的过程
  5. 初始化:执行类构造器<clinit>()方法的过程(包括类变量的赋值和静态语句块)
类加载器

注意:比较两个类是否“相等”,只要加载它们的类加载器不同,那这两个类就必定不相等。

双亲委派模型

工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

这里写图片描述

第八章 虚拟机字节码执行引擎

栈帧:是用于支持虚拟机进行方法调用和方法执行的数据结构。如下图所示

这里写图片描述

  • 局部变量表:一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量
  • 操作数栈:后入先出(LIFO)
  • 动态连接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。
  • 方法返回地址
方法调用
  • 解析:在编译期间确定,在类装载的解析阶段就会把涉及的符号引用全部转变为可确定的直接引用。
  • 分派
  • 动态类型语言支持:JDK 7新增invokedynamic字节码指令

第九章 类加载及执行子系统的案例与实战

略

第十章 早期(编译期)优化

三类编译器
  • 前端编译器:Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)
  • JIT编译器(后端编译器):HotSpot VM的C1、C2编译器
  • AOT编译器:GNU Compiler for the Java(GCJ)、Excelsior JET
Javac编译过程
  • 编译与填充符号过程
  • 插入式注解处理器的注解处理过程
  • 分析与字节码生成过程
Java语法糖的味道
  • 泛型和类型擦除:Java中的泛型实现方法称为类型擦除,也称伪泛型
  • 自动装箱、拆箱与遍历循环
  • 条件编译:使用条件为常量的if语句

第十一章 晚期(运行期)优化

概述:

即时编译器:
当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。

第12章 Java内存模型与线程

Java内存模型
线程、主内存、工作内存三者的交互关系:

这里写图片描述

内存间交互操作
  • lock(锁定)
  • unlock(解锁)
  • read(读取)
  • load(载入)
  • use(使用)
  • assign(赋值)
  • store(存储)
  • write(写入)
volatile关键字

两种特性:
1. 保证此变量对所有线程具有可见性
2. 禁止指令重排序优化

注意:volatile保证此变量对所有线程具有可见性,但是变量的运算在并发下一样是不安全的

使用场景:
- 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值
- 变量不需要与其他的状态变量共同参与不变约束

三种特性
  • 原子性

    1. 基本数据类型的访问读写具有原子性(long和double除外)
    2. 使用lock和unlock满足更大范围的原子性,虚拟机提供了monitorenter和moniterexit字节码指令,反应到Java代码中就是同步块——synchronized关键字
  • 可见性

    1. 通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性
    2. volatile、synchronized和final都能实现可见性
  • 有序性

    1. 如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。
    2. 前半句是指“线程内表现为串行的语义”,后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”的现象。
先行发生原则

指的是Java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到,“影响”包括修改了内存中共享变量的值、发送了消息、调用了方法等。

线程
线程的实现
  1. 使用内核线程实现
  2. 使用用户线程实现
  3. 使用用户线程加轻量级线程混合实现
  4. Java线程的实现
Java线程调度
  • 协同式线程调度:线程的执行时间由线程本身来控制
  • 抢占式线程调度:由系统来分配执行时间(Java使用的方式)
状态转换
  • 新建(New)
  • 运行(Runnable)
  • 无限期等待(Waiting):需要等待被其他线程显式地唤醒
  • 限期等待(Timed Waiting):一定时间后会被系统自动唤醒
  • 阻塞(Blocked)
  • 结束(Terminated)

第13章 线程安全与锁优化

各种操作共享的五类数据
  1. 不可变:基本数据类型声明为final即可;将对象中带有状态的变量都声明为final
  2. 绝对线程安全:不管运行环境如何,调用者都不需要任何额外的同步措施
  3. 相对线程安全:对于一些特定顺序的连续调用,可能需要在调用端使用额外的同步手段来保证调用的正确性。例如Vector、HashTable、Collections的synchronizedCollection()方法包装的集合。
  4. 线程兼容:对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全地使用。例如ArrayList和HashMap。
  5. 线程对立:无论调用端是否采取了同步措施,都无法在多线程环境中并发使用的代码。例如Thread类的suspend()和resume()方法。
线程安全的实现方法
  1. 互斥同步:synchronized关键字和ReentrantLock
    ReentrantLock增加的三个功能:
    • 等待可中断
    • 可使用公平锁
    • 锁绑定多个条件
  2. 非阻塞同步:CAS操作,例如J.U.C包里面的整数原子类,其中的compareAndSet()和getAndIncrement()等方法都是用了Unsafe类的CAS操作
  3. 无同步方案:如果一个方法本来就不涉及共享数据,就无须任何同步措施
    • 可重入代码
    • 线程本地存储:如果共享数据的代码能保证在同一个线程中执行,就可以把共享数据的可见范围限制在同一个线程之内。通过java.lang.ThreadLocal类来实现线程本地存储的功能。
锁优化
  1. 自旋锁与自适应锁:让后面请求锁的线程等待,执行一个忙循环(自旋)。避免了线程切换的开销,但是只适用于锁被占用时间很短的情况。
  2. 锁消除:指的是虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除。例如对String字符串的拼接操作。
  3. 锁粗化:如果一系列的连续操作都是对同一个对象进行加锁和解锁,就会把加锁同步的范围扩展到整个操作序列的外部。
  4. 轻量级锁:在无竞争的情况下使用CAS操作去消除同步使用的互斥量。
  5. 偏向锁:在无竞争的情况下把整个同步都消除掉,连CAS操作都不做了。
第3版•系统集成项目管理工程师(中级) │ 第6章 数据工程 🥏第3版•系统集成项目管理工程师(中级) │ 第6章 数据工程 阅读详情

相关推荐

手把手教你用STM32CubeMX和HAL库驱动DW3000:从SPI配置到第一个测距Demo

本文详细介绍了如何使用STM32CubeMX和HAL库驱动DW3000 UWB定位通信模块,从SPI配置到实现厘米级测距Demo的全过程。涵盖硬件连接、SPI通信调试、驱动移植及双向测距(TWR)算法实现,帮助开发者快速掌握UWB高精度定位技术,适用于仓储物流、智能家居等场景。

weixin_27038245的博客 485

《深入理解java虚拟机》读书笔记

1. 运行时数据区域 1.1 程序技术器 可以看作是当前线程所执行的字节码的行号指示器,通过它来取下一条需要执行的指令。 线程私有内存。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。 因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线

啊哈的博客 1505

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3007

深入理解JVM虚拟机读书笔记【第六章】类文件结

本章主要内容   6.1 概述 6.2 无关性的基石 6.3 Class类文件结构 6.3.1 无符号数 6.3.2 表 6.3.3 魔数与Class文件的版本 6.3.4 常量池 6.3.5 访问标志 6.3.6 类索引,父类索引与接口索引集...

wssjdysf1的专栏 515

VS2022打包C#安装包(最新、最全)

VS2022打包C#安装包(最新、最全)

qq_37959253的博客 9910

ENVI5.6 自动化流程:GF系列卫星影像批处理与质量优化

本文详细介绍了如何利用ENVI5.6构建针对GF-2、GF-6、GF-7系列卫星影像的自动化批处理流水线。通过配置Batch Processing工具,实现从正射校正到图像融合的全流程批量处理,并分享参数设置、质量监控与故障排查的实战经验,旨在显著提升海量遥感影像的处理效率与成果质量。

efc1234567的博客 604

《深入理解java虚拟机》-读书笔记一

一、java内存区域和内存溢出异常 java虚拟机所管理的内存包括如下几个区域: 程序计数器 它是较小的内存空间,可以看做是当前线程执行的字节码的行号指示器。由于java多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个时刻一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个程序计数器,各条线程之间计数器互不影响。一般把...

aiyabeetle的博客 283

GD32F105RBT6 keil工程模板

创建GD32F105RBT6的keil初始基础工程,未来的所有外设驱动都是基于这个基础工程进行扩展。

RMDYBW的博客 1929

读书笔记——深入理解虚拟机

自动内存管理机制 Java与C++之间有一堵由内存分配和垃圾收集所围成的“高强”,墙外面的人想进去,强里面的人却想出来。 java内存区域与内存溢出异常 每个线程私有 程序计数器:可以看做是当前线程所执行的字节码的行号指示器。 Java虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法

求知若渴!大智若愚! 1850

某东x-api-eid-token风控参数分析与破解

x-api-eid-token是京东的风控参数,在接口当中,如果没有该参数,有一定的概率能请求成功,但是在请求一段时间后,会报403权限失败的,该参数主要通过jsTk.do这个接口生成,并且会将其存储到cookie当中。

zhouzhou_98的博客 1552

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 899

读书笔记-《深入理解Java虚拟机》-JVM内存模型

版权声明:本文来自 Crocutax 的博客 , 转载请注明出处 http://crocutax.com Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自不同的用途:程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,属于线程私有区域,此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemor

闰土CMS 1874

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

《深入理解Java虚拟机》读书笔记(一)--Java和Java虚拟机发展

目录 一、Java发展史 二、Java虚拟机(部分) 2.1 Sun Classic VM 2.2 Sun Exact VM 2.3 Sun HotSpot VM 2.4 BEA JRockit VM 2.5 BEA Liquid VM 2.6IBM J9 VM 2.7 Azul VM 2.8 Microsoft JVM 三、总结 一、Java发展史 1991年4月,James Gosling博士领导绿色计划(Green Project),产品为Java语言的前身:Oak(橡树).

黄智霖的博客 5193

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

《深入理解Java虚拟机》读书笔记十

《深入理解Java虚拟机》读书笔记十 第十一章 晚期(运行期)优化 1、HotSpot虚拟机内的即时编译 解释器与编译器: 许多Java虚拟机的执行引擎在执行Java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码)两种选择 即时编译器: 当虚拟机发现某个方法或者代码块的运行特别频繁时,就会...

AmyZheng_的博客 449

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

《深入理解Java虚拟机》读书笔记九

《深入理解Java虚拟机》读书笔记九 第十章 早期(编译期)优化 1、Javac的源码与调试 编译期的分类: 前端编译期:把*.java文件转换为*.class文件的过程。例如sun的javac、eclipseJDT中的增量编译器。 JIT编译期:后端运行期编译器,把字节码转换成机器骂的过程。例如 HotSpot VM的C1、C2...

AmyZheng_的博客 290

读书笔记-深入理解Java虚拟机

only_onion的博客 130

《深入理解Java虚拟机》读书笔记七

《深入理解Java虚拟机》读书笔记七 第八章 虚拟机字节码执行引擎 1、运行时栈帧结构 概述: 栈帧是用于支持虚拟机进行方法调用的和方法执行的数据结构,他是虚拟机运行时数据区中的虚拟机栈的栈元素,栈帧存储了方法的局部变量,操作数栈,动态连接和方法返回值等信息,每个方法从调用开始到执行完成的过程都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过...

AmyZheng_的博客 223

《深入理解Java虚拟机》读书笔记十二

《深入理解Java虚拟机》读书笔记十二 第十二章 Java内存模型与线程 1、硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。 每个处理器都有自己的高速缓存,而它们又共享同一主内存(Main...

AmyZheng_的博客 239

《深入理解Java虚拟机》读书笔记(四)--虚拟机性能监控与故障处理工具

一、JDK命令行工具 此书是第二版,本章介绍的工具基于Windows平台下的JDK 1.6 Update 21。 1.1 jps:虚拟机进程状况工具 可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称(main函数所在类)以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。其常用选项见下表; jps工具主要选项 选项 作用 -q 只输出LVMID -m 输出虚拟机进程启动时传递给main函数的参数 -l

黄智霖的博客 4637

【深入理解JAVA虚拟机】读书笔记——运行时栈帧结构

学习参考资料:周志明老师的著作《深入理解Java虚拟机(第3版)》 运行时栈帧结构 栈帧存储了方法的局部变量、操作数栈、动态连接、方法返回值和一些附加信息。 每个方法从调用到结束都伴随着一个栈帧从入栈到出栈的过程。 另外,在编译Java源代码时,一个栈帧的局部变量表的大小和操作数栈的深度就已经被确定了,并且写入Class文件中方法的Code属性。 1.局部变量表(重点) 作用 局部变量表用于存放方法参数和方法内部定义的局部变量。 组成 局部变量表的最小单位是变量槽,一个变量槽可以存放32位以内的数据类.

遇事不决问清风的博客 1450

《深入理解Java虚拟机》读书笔记八

《深入理解Java虚拟机》读书笔记八 第九章 类加载及执行子系统的案例与实战 Q:如果有10个WEB应用程序都是用Spring来进行组织管理的话,可以把Spring放到Common或Shared目录下(Tomcat5.0)让这些程序共享。Spring要对用户程序的类进行管理,自然要能访问到用户程序的类,而用户程序显然是放在/WEB-INF目录...

AmyZheng_的博客 317

《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(上)

目录 前言 一、运行时栈帧结构 1.1 局部变量表 1.2 操作数栈 1.3 动态连接 1.4 方法返回地址 1.5 附加信息 二、确定执行方法 2.1 解析 2.2 分派 2.2.1 静态分派 2.2.2 动态分派 2.2.3 单分派和多分派 2.2.4 虚拟机动态分派的实现 前言 本章主要讲述虚拟机如何确定调用方法的版本和如何执行方法。 一、运行时栈帧结构 1.1 局部变量表 用于存放方法参数和方法内定义的局部变量。在编译阶段,就在方法表的Code属性的max.

黄智霖的博客 8054

《深入理解Java虚拟机(第三版)》读书笔记:虚拟机类加载机制、虚拟机字节码执行引擎、编译与优化

JVM虚拟机类加载机制、虚拟机字节码执行引擎、编译与优化

阿正的梦工坊 1534

深入理解Java虚拟机 读书笔记

深入理解Java虚拟机 读书笔记Java的内存区域 程序计数器,就是操作系统里面的PC指针,指向当前执行的代码的地址,线程私有。 Java虚拟机栈,线程私有,每个线程对应一个栈,每个方法对应一个栈帧,一个方法的执行就是出栈入栈的过程。 Java堆,线程共享的,用于存放对象的实例,垃圾收集管理的主要区域,大部分GC采用分代收集法,所以GC区分为新生代和老年代。(更详细的垃圾回收部分后面会讲) 方法区,

huanglong0438的专栏 575
上一篇: MySQL优化
下一篇: JAVA最全面试题答案整理
刘五分
博客等级 码龄10年 15粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值