
Java 虚拟机
文章平均质量分 80
张小琦
这个作者很懒,什么都没留下…
展开
-
深入理解java虚拟机(七)类加载的时机
Class 文件中描述的各种信息都必须加载到虚拟机中才能运行和使用。而虚拟机怎么加载这些Class 文件呢?Class 文件进入到虚拟机中会发生什么变化呢?虚拟机类加载机制是指 虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的Java 类型。原创 2014-08-27 09:11:17 · 2476 阅读 · 0 评论 -
深入理解java虚拟机(十四)正确利用 JVM 的方法内联
在IntelliJ IDEA里面Ctrl+Alt+M用来拆分方法。选中一段代码,敲下这个组合,非常简单。Eclipse也用类似的快捷键,使用 Alt+Shift+M。我讨厌长的方法,提起这个下面这个方法我就觉得太长了:原创 2014-10-19 20:59:01 · 3765 阅读 · 0 评论 -
深入理解java虚拟机(九)类加载器以及双亲委派模型
虚拟机把类加载阶段中“通过一个类的权限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。原创 2014-08-28 19:24:29 · 3778 阅读 · 1 评论 -
深入理解java虚拟机(十一) 方法调用-解析调用与分派调用
方法调用过程是指确定被调用方法的版本(即调用哪一个方法),并不包括方法执行过程。我们知道,Class 文件的编译过程中并不包括传统编译中的连接步骤,一切方法调用在 Class 文件调用里面存储的都只是符号引用,而不是方法在实际运行时的内存布局入口地址,也就是说符号引用解析成直接引用的过程。这个特性使得Java 具有强大的动态扩展能力,但也使得 Java方法调用过程变得复杂起来,需要在类加载器件,甚至是运行期间才确定目标方法的直接饮用。原创 2014-09-01 15:56:08 · 2933 阅读 · 0 评论 -
深入理解java虚拟机(十) Java 虚拟机运行时栈帧结构
栈帧(Stack Frame) 是用于虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素。每一个方法从调用到方法返回都对应着一个栈帧入栈出栈的过程。每一个栈帧在编译程序代码的时候所需要多大的局部变量表,多深的操作数栈都已经决定了,并且写入到方发表的 Code 属性之中,一次一个栈帧需要多少内存,不会受到程序运行期变量数据的影响,仅仅取决于具体的虚拟机实现。一个线程中方法调用可能很长,很多方法都处于执行状态。对于执行引擎来说,只有处于栈顶的栈帧才是有效的,称为当前栈帧(Current原创 2014-08-29 15:52:52 · 14423 阅读 · 2 评论 -
深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式
内存中对象的创建、对象的结构以及访问方式。一、对象的创建在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢?(一)判断类是否加载。虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载、解析并初始化。如果没有完成这个过程,则必须执行相应类的加载。(二)在堆上原创 2014-08-17 19:06:13 · 2858 阅读 · 0 评论 -
深入理解java虚拟机(八)类加载过程详解
类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中,验证、准备和解析统称为连接(Linking)。过程如下图所示。原创 2014-08-27 15:48:00 · 1908 阅读 · 0 评论 -
深入理解java虚拟机(六)字节码指令简介
Java虚拟机指令是由(占用一个字节长度、代表某种特定操作含义的数字)操作码Opcode,以及跟随在其后的零至多个代表此操作所需参数的称为操作数 Operands 构成的。由于Java虚拟机是面向操作数栈而不是寄存器的架构,所以大多数指令都只有操作码,而没有操作数。字节码指令集是一种具有鲜明特点、优劣势都很突出的指令集架构:原创 2014-08-26 15:11:08 · 5740 阅读 · 1 评论 -
深入理解java虚拟机(十三) Java 即时编译器JIT机制以及编译优化
在部分的商用虚拟机中,Java 程序最初是通过解释器( Interpreter )进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,即时编译器(Just In Time Compiler )会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。原创 2014-09-09 23:16:38 · 6723 阅读 · 0 评论 -
深入理解java虚拟机(三)对象回收判断算法以及死亡过程
在堆里面存放着Java几乎所有的对象实例,垃圾收集器要进行垃圾回收,要做的di原创 2014-08-21 15:15:02 · 2913 阅读 · 1 评论 -
深入理解java虚拟机(五)垃圾收集器
垃圾收集器是垃圾收集算法的具体实现。Java规范对垃圾收集器的实现没有做任何规定,因此不同的虚拟机提供的垃圾收集器可能有很大差异。HotSpot虚拟机1.7版本使用了多种收集器。如下图。原创 2014-08-22 15:22:56 · 3119 阅读 · 2 评论 -
深入理解java虚拟机(一)虚拟机内存划分
java虚拟机运行时内存区域主要分为原创 2014-07-22 22:22:59 · 18610 阅读 · 4 评论 -
深入理解java虚拟机(四)垃圾收集算法及HotSpot实现
垃圾收集算法一般来说,垃圾收集算法分为四类:最基础的算法便是标记-清除算法(Mark-Sweep)。算法分为“标记”和“清除”两个阶段:首先标记处需要收集的对象,在标记完成之后,再统一回收所有被标记的对象。这是最简单的一种算法,但是缺点也是很明显的:一个是效率问题,标记和清除效率都不高。二是空间问题,清除之后会产生大量的空间碎片,导致之后分配大对象找不到足够的连续对象而不得不触发另一次垃圾收集动作。算法执行过程如下图。原创 2014-08-22 15:01:22 · 2726 阅读 · 0 评论 -
深入理解java虚拟机(十二) Java 语法糖背后的真相
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语。指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会;但是这种语法对语言的功能并没有影响。Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是,下面做简单的介绍和分析。原创 2014-09-05 23:40:25 · 3289 阅读 · 0 评论 -
对象的内存结构及占用空间的计算方法
很早就对数据在内存中的结构和体积有深入了解的想法。平时写代码的过程中,对于这些完全处于一种感性的认识,对于代码中使用的数据结构和对象,尤其是处理大量数据的时候,总有种把控不住的感觉。趁周六日有时间的功夫,通过查阅一些有关虚拟机和内存对象的资料,和Eclipse查看源码,自己琢磨着实实在在计算一下一个对象到底是占用了多少空间,它在内存中到底是个什么样子的。于是经过了两天的探索,总于有了下面这篇文章。对于文章中涉及到的数据,不同的JDK环境可能会有一些小出入,这包括 JDK的版本,JDK32/64位,JVM参原创 2015-07-28 18:01:00 · 5079 阅读 · 3 评论