JVM
文章平均质量分 71
再等三分钟
这个作者很懒,什么都没留下…
展开
-
JVM运行时数据区
java虚拟机会在执行java程序的过程中把它所管理的内存划分为若干个不同的数据区域划分为若干个不同的数据区域。(1)程序计数器程序计数器是一块比较小的内存空间,它的作用可以看成当前线程所执行的字节码的行号指示器,在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转原创 2016-10-11 16:18:57 · 206 阅读 · 0 评论 -
JVM优化技术
1、语言无关的经典优化技术之一:公共子表达式消除公共子表达式消除是一个普遍应用于各种编译器的经典优化技术,它的含义是:如果一个表达式E已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E的这次出现就成为了公共子表达式,对于这种表达式,没有必要花时间再对它进行计算,只需要直接用前面计算过的表达式结果替代E就可以了,举个例子简单说明它的优化过程,假设有如下代码int原创 2016-10-28 17:54:27 · 689 阅读 · 0 评论 -
虚拟机执行引擎
执行引擎是java虚拟机最核心的组成部分之一。虚拟机是相对于“物理机”的概念,这两种机器都有代码执行能力,区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。在java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行原创 2016-10-18 19:14:00 · 633 阅读 · 0 评论 -
晚期(运行期)优化
1、概述java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”,为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just in Time Compiler JIT).即时编译器并不是虚拟机必需的部分,java虚拟机规范中并没有规定原创 2016-10-27 19:40:07 · 453 阅读 · 0 评论 -
类加载器
虚拟机设计团队把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到java虚拟机外部去实现,以便让应用程序自己决定如何获取所需要的类,实现这个动作的代码模块被称为“类加载器”。(1)类与类加载器类加载器虽然只用于实现类的加载动作,但它在java程序中起到的作用却远远不限于类加载阶段,对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在java虚拟机中的原创 2016-10-17 15:48:00 · 198 阅读 · 0 评论 -
类加载过程
1、加载“加载”阶段是“类加载”过程的一个阶段,二者不能混淆。在加载阶段,虚拟机需要完成以下三件事:(1)通过一个类的全限定名来获取定义此类的二进制字节字节流。(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。(3)在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。第一个通过类全限定名来获取二进制字节流,并没有原创 2016-10-14 18:02:25 · 1775 阅读 · 0 评论 -
虚拟机类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化、最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。1、类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading)、验证(Verfication)、准备(Preparation)、解析(Resolution)、初始化(Initializati原创 2016-10-14 16:17:32 · 210 阅读 · 0 评论 -
java中的class文件
java是一次编译多次运行,是因为java中的JVM的作用,使用Java编译器可以把java代码编译为存储字节码的class文件。使用JRuby等其他语言编写,java虚拟机一样可以把程序代码编译成class文件,所有实现语言无关性的基础是虚拟机和字节码存储格式。虚拟机并不关心class文件的来源是什么语言,只要它符合class文件应有的结构就可以在java虚拟机中运行。java语言中的各种变原创 2016-10-13 19:28:16 · 879 阅读 · 0 评论 -
对象内存分配策略
java技术体系提倡的自动内存管理最终可以归结为自动化解决了两个问题:给对象分配内存以及回收分配给对象的内存。下面说一下内存分配,对象内存分配,往大方向上讲就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配,少数情况下可能会直接分配在老年代中, 分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集组合,还有虚拟机中与内原创 2016-10-12 16:32:28 · 325 阅读 · 0 评论 -
垃圾收集算法
(1)标记-清除算法最基础的算法是标记-清除算法(mark-sweep),算法分为标记、清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。后续的收集算法都是基于这种思路并对其缺点进行改进而得到的,主要缺点:一是效率问题,标记和清除过程的效率都不高,二是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大的对原创 2016-10-11 20:29:58 · 310 阅读 · 0 评论 -
垃圾收集器与内存分配策略
1、对象已死?堆中几乎存放着java世界中所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是确定这些对象由哪些是“存活”的,哪些是“死去”(不可能再被任何途径使用的对象)。(1)引用计数算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效,计数器就减1;任何时刻计数器为0的对象就是不可能再被使用的。最大问题:它很难解决对象之间的相互循环引用的问题。原创 2016-10-11 19:47:17 · 248 阅读 · 0 评论 -
JVM中对象访问方式
1、Object Object= new Object(); 其中Object obj 这部分将会反映到java栈的本地变量表中,作为一个reference类型数据出现,而new Object这部分会反映到java堆中,形成一块存储了Object类型所有实例数据值的结构化内存。另外在java堆中还必须包含能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在原创 2016-10-11 17:42:56 · 1070 阅读 · 0 评论 -
由静态变量引发的问题
在程序中定义了public class Const { public static Map<String, String> MAP = new ConcurrentHashMap<>();}在一个程序中对map进行赋值public static void main(String[] args){ Const.MAP.put("N","N"); Sy...原创 2018-05-29 20:25:58 · 465 阅读 · 0 评论