JVM
碰碰猪
华中科技大学自动化研究生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
初识Java虚拟机(1)对象的访问定位
Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机实现而定的。目前主流的访问方式有使用句柄和直接指针两种。 句柄访问:堆中会分为句柄池和对象池,reference中储存的是对象的句柄地址,而句柄中原创 2017-01-22 11:26:37 · 226 阅读 · 0 评论 -
Java内存模型的几个关键词
Java内存屏障:为了保证内存的可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。Java内存模型把内存屏障指令分为四类如下: 1)LoadLoad Barriers :确保Load1数据的装载先于Load2及所有后续转载指令的装载。 2)StoreStore Barriers:确保Store1数据对其他处理器可见先于Store2及所原创 2017-06-23 19:37:58 · 302 阅读 · 0 评论 -
Java多线程中实现原子操作的方法
在Java中可以通过锁和循环CAS操作的方式来实现原子操作。一,使用循环CAS实现原子操作 JVM中的CAS操作是利用了处理器提供的 CMPXCHG 指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作,直到成功为止。CAS是Compare And Swap的缩写,其操作需要输入两个值,一个旧值,一个新值,在操作期间比较旧值有没有发生改变,如果没发生,才交换成新值,发生了变化则原创 2017-06-23 10:59:04 · 940 阅读 · 0 评论 -
初识Java虚拟机(11)内存模型
Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的实现细节。它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,也不会存在竞争问题。 Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,原创 2017-01-28 10:54:53 · 860 阅读 · 0 评论 -
初识Java虚拟机(10)动态分派的实现
上一节已经介绍了分派过程,是虚拟机概念模型的基本介绍。对于虚拟机实际是如何做到的,在这节进行解释。 由于动态分派是非常频繁的操作,而且动态分派的方法版本选择过程需要运行时在类的方法元数据中搜索合适的目标方法,因此在虚拟机的实际实现中,最常用的“稳定优化”手段就是在类方法区中建立一个虚方法表。虚方法表中存放着各个方法的实际入口地址,如果某个方法在子类中没有重写,那么子类的虚方法表里面的地址原创 2017-01-27 10:47:40 · 409 阅读 · 0 评论 -
初识Java虚拟机(9)方法调用
方法调用并不等于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本。Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行内存布局中的入口地址。 解析 在类加载的解析阶段,会将Class文件的一部分符号引用转化为直接引用,前提是:方法的程序真正运行之前就有一个可确定的调用版本,并且在运行期间不可变。原创 2017-01-26 19:21:30 · 293 阅读 · 0 评论 -
初识Java虚拟机(8)运行时栈帧结构
栈帧是虚拟机运行时数据区中的虚拟机栈的栈元素,储存了局部变量表、操作数栈、动态链接和方法返回地址等栈元素。每一个方法从开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。执行引擎的所有字节码指令都只针对当前栈帧进行操作。 局部变量表 (1)局部变量表(Local Variable Table)是一组变量储存空间,用于存放方法参数和方法内部定义的局部变量。原创 2017-01-25 15:33:13 · 526 阅读 · 0 评论 -
初识Java虚拟机(7)类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用远远不限于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每个类加载器都有一原创 2017-01-25 11:00:23 · 327 阅读 · 0 评论 -
初识Java虚拟机(6)类文件加载
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。在Java语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的,为Java程序提供了高度的灵活性。 类从加载到内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Pr原创 2017-01-24 20:43:44 · 301 阅读 · 0 评论 -
初识Java虚拟机(5)类文件结构
各种不同平台的Java虚拟机和所有平台都同意使用字节码(Bytecode)作为程序储存格式,它是构成平台无关性的基石,符合Java刚刚诞生之时提出的“一次编写,到处运行”(Write Once,Run Anywhere)。Java虚拟机的语言无关性的基础仍然是虚拟机和字节码的储存格式。Java虚拟机不与任何语言绑定,它只与“Class文件”这种特定的二进制文件格式相关联,虚拟机并不关心Class文原创 2017-01-24 10:32:11 · 284 阅读 · 0 评论 -
初识Java虚拟机(4)垃圾回收算法
标记-清除算法 首先标记处所有需要回收的对象,标记完成后统一回收所有被标记的对象。该方法的主要不足有两个,一是效率问题,标记和清除两个过程的效率都不高;另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后的程序运行过程中需要大内存对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾回收动作。 复制算法 为了解决效率问题,复制算法将内存原创 2017-01-22 15:44:01 · 215 阅读 · 0 评论 -
初识Java虚拟机(3)对象生死
Java虚拟机的垃圾回收器在对堆进行回收前,需要确定对象是否还“活着”。下面两种方法可以帮助GC判断对象生死: 1.引用计数法(Reference Counting) 给对象添加一个引用计数器,每当一个地方引用它时,计数器值就加1;引用失效时,计数器值减1:任何计数器为0的对象就是不可能再被使用的。 该方法使用简单,判定效率高,但是难以解决对象间相互循环引用的问题原创 2017-01-22 14:52:23 · 278 阅读 · 0 评论 -
初识Java虚拟机(2)初探内存
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁时间。根据《Java虚拟机规范》,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。 1.程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念原创 2017-01-22 13:16:21 · 266 阅读 · 0 评论 -
Java中的volatile关键字
当变量声明为volatile后,这个变量仿佛就具有了同步的特性,那么,volatile和正真的同步有什么区别呢?什么情况下,使用volatile可以代替Synchronized呢?下面我将同大家一起学习volatile关键字。 一,volatile特性 对volatile变量的单个读/写,可以看成为使用同一个锁,对普通变量的单个读操作函数和写操作函数进行加锁(不能是I++这种操作原创 2017-06-23 20:43:53 · 280 阅读 · 0 评论
分享