JVM虚拟机
JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。本专栏包括对JVM中内存模型、JVM垃圾回收机制
、Java类加载机制、虚拟机字节码执行引擎进行详解与总结
Master.TJ
https://github.com/fengruotj
展开
-
深入理解JVM虚拟机(十一):线程安全与锁优化
1. 线程安全线程安全的定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的。1.1 Java语言中的线程安全这里讨论的线程安全,就限定于多个线程之间存在共享数据访问的这个前提。按照线程安全的“安全程度”由强到弱排序,可以把Java中...原创 2018-12-21 21:29:31 · 599 阅读 · 0 评论 -
深入理解JVM虚拟机(十):Java内存模型与多线程
1. 硬件的效率与缓存一致性由于存储设备和处理器运算速度之间的存在巨大的差异,现在计算机系统在内存与处理器之间加入高速缓存来作为处理器与内存之间的缓冲。将处理器需要的数据复制到缓存中,让处理器可以快速的获取数据进行计算,计算结束后再从缓存同步带内存中去,这样处理器无需等待缓慢的内存读写。虽然它很好的解决了处理器与存储的速度矛盾,但是它也为计算机系统带来更高的复杂度以及一个新问题:缓存一致性。...原创 2018-12-21 20:53:34 · 1811 阅读 · 1 评论 -
JVM 类加载机制:编译器常量与初始化
1. 前言最近在研究JVM虚拟机类加载机制的时候,我们了解到了类加载机制的生命周期以及在准备阶段,JVM虚拟机会对类的静态变量进行初始化,这个时候只是会将静态变量初始化为默认的初始值。对静态变量的定义的初始化值,将会被封装到clinit()方法中,直到初始化阶段进行初始化。但是对于静态常量会使一个特例,下面我们将来看看JVM虚拟机对于静态常量是如何进行操作的。2.类加载机制下面我们再来复习一...原创 2018-12-16 16:01:33 · 799 阅读 · 0 评论 -
深入理解JVM虚拟机(九):运行期优化与JIT编译器
1. JIT编译器的引入首先我们这篇文章中所说的编译器都是指JVM的组成部分之一—即时编译器(JIT),与生成Java字节码的javac编译器要区分开来。首先我们这篇文章中所说的编译器都是指JVM的组成部分之一—即时编译器(JIT),与生成Java字节码的javac编译器要区分开来。JIT的出现,是为了补强虚拟机边运行边解释的低性能。它会智能地对热点代码进行优化且重复利用,最终将这些代码编译为与...原创 2018-12-15 20:26:18 · 844 阅读 · 0 评论 -
深入理解JVM虚拟机(八):编译器优化
本博客从编译期源码实现的层次上让我们了解了Java源代码编译为字节码的过程,分析了Java语言中泛型、主动装箱/拆箱、条件编译等多种语法糖的前因后果。1. 概述java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确点)把*.java文件转化为*.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In T...原创 2018-12-15 19:27:53 · 690 阅读 · 0 评论 -
深入理解JVM虚拟机(七):虚拟机字节码执行引擎
代码编译的结果就是从本地机器码转变为字节码。我们都知道,编译器将Java源代码转换成字节码?那么字节码是如何被执行的呢?这就涉及到了JVM字节码执行引擎,执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致:输入:字节码文件处理:字节码解析输出:执行结果。所有的Java虚拟机的执行引擎都是一致的:输入的是字节码执行文件,处理的过程是字节码解析的等效过程,输出的...原创 2018-12-14 12:17:12 · 652 阅读 · 0 评论 -
深入理解JVM虚拟机(六):虚拟机类加载机制
1. 概述虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类记载机制。与那些在编译时需要进行连接工作的语言不同,在Java7语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会为Java程序提高高度的灵活性,在Java里面天生可以动态扩...原创 2018-12-12 16:53:45 · 669 阅读 · 1 评论 -
深入理解JVM虚拟机(五):字节码指令简介
Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码)以及跟随其后的零至多个代表此操作所需参数(操作数)而构成。由于 Java 虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。1. 字节码与数据类型在 Java 虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。例如,iload 指令用于从局部变量表中加载 ...原创 2018-12-11 17:53:25 · 518 阅读 · 0 评论 -
深入理解JVM虚拟机(四):Class类文件结构(二)
属性表在前面的讲解中出现多次,在Class文件、字段表、方法表都可以携带自己的属性表集合,用于描叙某些场景专有的信息。为了正确解析Class文件,《Java虚拟机规范(第二版)》中预定义了9项虚拟机实现应当识别的属性。然而在最新的《Java虚拟机规范(Java SE7)》中属性表已经增加到了21项。当然我们不用全部记住它们,只需要熟悉其中的几个关键属性。1.属性表的基本结构本次博客只谈其中的5...原创 2018-12-11 17:31:15 · 874 阅读 · 0 评论 -
深入理解JVM虚拟机(四):Class类文件结构(一)
我们都知道Java中的class文件是经过Java编译器对Java类文件进行编译后的产物。我想有不在少数的C程序员在学习Java之后在认知上会粗略的认为C程序在经过编译后产生的.out文件与.class文件在各方面大概相同,我刚开始也这样迷惑自己,但是随着学习的深入,我们必须搞清楚.class文件到底是个什么东西。本博客就带领大家理解Java中Class类文件结构。1. .class文件和.ou...原创 2018-12-11 16:59:02 · 953 阅读 · 0 评论 -
深入理解JVM虚拟机(三):虚拟机性能监控工具
本博客将讲解Java虚拟机性能监控工具的使用以及对Java虚拟机进行性能监控的实验。Java开发人员需要对虚拟机性能监控工具的使用进行掌握,这是很有必要的。1.概述给一个系统定位问题的时候,知识、经验是关键基础,数据是依据。工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照文件(threaddump/javacore文件)、堆转储快照(heapdump/hp...原创 2018-12-11 15:05:58 · 602 阅读 · 0 评论 -
深入理解JVM虚拟机(二):垃圾回收机制
谈起GC,应该是让Java程序员最激动的一项技术,我相信每个Java程序员都有探究GC本质的冲动!JVM垃圾回收机制对于了解对象的创建和对象的回收极为重要,是每个Java程序员必须掌握的技能。本博客围绕三个问题来展开哪些内存需要回收?什么时候回收?如何回收?前面介绍了Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生,随线程而灭;栈中的栈针...原创 2018-12-11 11:03:12 · 683 阅读 · 0 评论 -
JVM 内存模型:运行时常量池
1. 前言最近研究Java基础知识。发现Java运行时常亮池以及自动装箱和自动拆箱中有些一些细节的地方,值得我们注意的地方,最为一个Java开发人员对于这种java基本特性我们需要去深入研究和掌握。2. 运行时常量池运行时常量池存在于方法区中,用于存放编译期生成的各种字面量和符号引用。2.1 String PoolString Pool是运行时常量池中虚拟出来的一个概念。Java中字符...原创 2018-12-09 14:55:15 · 720 阅读 · 1 评论 -
JVM内存模型:运行时栈帧结构
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 每一个栈帧都包括了局部变量表,操作数栈,动态...原创 2018-06-30 17:59:11 · 819 阅读 · 0 评论 -
深入理解Java虚拟机(一):Java内存模型
1.Java 虚拟机运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。1.1 程序计数器 在Java虚拟机中,程序计数器是线程私有的。程序计数器是一块较少的内存区域,它可以看...原创 2018-07-02 16:48:57 · 642 阅读 · 0 评论 -
JVM 内存模型:方法区(Method Area)
1. 前言最近在研究Java语言底层基础知识,发现对于JVM 内存模型理解不够深入。笔者突发奇想深入理解JVM内存模型,特在此介绍详细介绍一下JVM内存模型中的方法区。看似名称叫做方法区,其实不然。它存放了一些类加载基本信息、常量、静态变量以及编译后的代码等数据。下面我们来详细看一下其中的内容。运行时常量池也可以包含再方法区中,运行时常量池存放的是编译期间生成的各种字面量以及符号引用。关于字面量...原创 2018-12-08 15:14:45 · 1135 阅读 · 0 评论