JAVA虚拟机
云水禅音
Java软件开发爱好者。OSGi爱好者。数据库爱好者。
展开
-
深入理解JAVA虚拟机学习笔记1——内存
Java虚拟机在执行Java程序的过程中会在内存空间中分配出一块区域,用于程序的运行。虚拟机又会把这块所管理的内存划分为若干个不同的数据区域:虚拟机栈,本地方法区,程序计数器,堆,方法区。 左侧三个为线程私有,右侧两个为线程共享的区域。1. 程序计数器:当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程...原创 2018-05-14 21:06:55 · 320 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记12——Class类文件的结构(4属性)
我们的口号是:每天进步一点点!上一篇的字段写到属性的时候,由于属性涉及到的内容比较多,我们暂时搁置了,这一篇是Class文件结构的最后一篇,我们就详细说说属性表结合。九、属性(Attribute):从表中看属性部分分为属性个数(attributes_count)和属性信息(attributes),这个已经没什么好说的了(参考前面的文章),这个单独拿出来主要是属性的类型比较多,如下图所属。类中字段...原创 2018-06-08 07:53:12 · 292 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记9——JDK命令行工具
1. jps:虚拟机进程控制工具,可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些线程的本地虚拟机唯一ID。主要参数及功能见下表;本地运行后结果如下。2. jstat:虚拟机统计信息监视工具,监视虚拟机各种运行状态信息,如本地或远程(需要远程提供RMI支持)虚拟机进程中的类加载,内存占用,垃圾收集,JIT编译等。命令格式:jstat [ option vmid [inteval[s...原创 2018-06-01 09:35:47 · 313 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记10——JDK可视化工具JConsole
JConsole:Java 监视与管理控制台,基于JMX的可视化监视,管理工具。在jdk的bin目录下(如D:\Java\jdk1.8.0_131\bin),就可以找到jconsole.exe。在运行之前,我们先写用debug执行一段程序,创建一个线程,sleep30分钟。然后,再双击启动jconsole.exe。在如下界面中选择本地进程,笔者使用的是IDEA,这里选择第二个。打开之后,我们可以看...原创 2018-06-01 20:53:07 · 290 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记13——字节码指令1(加载和存储)
一个忙碌的周末又过去了,时间不能阻止我们前进的脚步,每天进步一点点!上一篇在方法体中,方法体被编译成了指令,我们已经初步了解了每条字节码指令占用一个字节, 大概有200余种字节码指令。虚拟机的解释器的工作流程大致如下图伪代码所示。对于这么多字节码命令,可以分为几个部分。一. 加载和存储指令:用于将数据在局部变量表和操作数栈之间传输。1、将一个局部变量加载到操作栈:iload、iload_<n>、...原创 2018-06-09 22:07:26 · 331 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记13——字节码指令2(运算指令)
本篇继续字节码指令的学习,开始之前,先巩固一下基础知识,Java中基本数据类型的范围。1. 整型:1.1 byte:数据类型是8位、有符号的整数,取值范围-128~127;1.2 short: 数据类型是 16 位、有符号的整数,取值范围-32768~32767;1.3 int:数据类型是32位、有符号的整数,取值范围为-2147483648~2147483647;1.4 long:数据类型是 6...原创 2018-06-09 22:10:01 · 365 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记14——类加载的初始化过程
每天进步一点点!上一篇已经学习了加载阶段,这一篇我们了解一下验证的过程。我们已经知道了,虚拟机加载的是Class字节码文件,我们也通过工具查看了文件中存储的是二进制流。下面我们打开一个文件AppTest.class,我们在文件的开头随便加入一个字母“f”,如下图所示。那么,我们通过命令行输入命令“java AppTest”,会出现什么结果呢?虚拟机会报一个Class文件格式化错误,这是我们随便修...原创 2018-06-25 08:47:55 · 470 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记13——字节码指令3(类型转换指令)
新的一天,新的开始。我们的口号是:每天进步一点点!在这几天的学习当中,不知道大家有没有一个疑惑,就是对“描述符”这个词不太理解,所以笔者前几篇写的时候尽量没用这个词。经过笔者艰苦卓绝的查找,终于大致理解了它的意思:我们要站在虚拟机的角度看这个问题。比如说给我传进来一个类的字段:private String a = "a";那我要知道这个字段叫什么名字(a),然后我要知道它的修饰限定符(priva...原创 2018-06-11 08:04:13 · 318 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记14——虚拟机的类加载机制概述
每天进步一点点!在前面的几篇中,我们已经详细学习了Class字节码文件的结构,包含哪些内容已经内容的含义,下面几篇我们将研习一下类的加载。虚拟机的类加载机制: 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、...原创 2018-06-19 09:55:52 · 288 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记15——字节码执行引擎(栈帧)
每天进步一点点!今天我们一起看一下类加载的准备阶段和解析阶段。先看一下准备阶段:主要任务是在方法区中为类变量(仅static修饰变量,不包含实例变量)分配内存并设置类变量初始化的阶段。这里面的区别,我们通过下面的代码来简单了解一下。我们将上面的代码编译好后,通过字节码工具看一下其中的信息。首先,从上图可以看出,被final修饰的b是直接赋值的。我们再打开classlib,如下图所示,b对应的是一...原创 2018-06-26 08:54:36 · 288 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记14——类加载的加载过程
每天进步一点点!上一篇穿插了一段动态绑定和静态绑定的知识,这一篇我们回归到类加载上来,学习一下类加载的“加载”。是不是读起来有点拗口,这是什么意思?别迷糊,还记得上一篇的上一篇学习过的类加载过程吗,里面有一个阶段就是“加载(loading)”。加载过程主要包括以下三点内容:1、通过一个类的全限定名来获取定义此类的二进制字节流。全限定名也就是包名.类名的形式。如下图所示,当我们在同一个类中,引用的...原创 2018-06-20 08:19:03 · 234 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记15——字节码执行引擎(方法调用)
每天进步一点点!前面已经介绍了类加载的加载、验证、准备、解析等过程,今天来学习最后一个过程,初始化!对于有过java开发经验的朋友们来说,初始化这个词自然不陌生,初始化阶段与变量初始化自然不是一个概念,但是也有一些关联。在上一篇中,我们已经看到了在准备阶段,不同变量初始化的区别,实际上,初始化阶段是执行类构造器<clinit>()方法的过程。朋友们还记得上一篇中的例子吗(有兴趣的朋友...原创 2018-06-28 08:19:01 · 247 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记15——字节码执行引擎(解释执行)
每天进步一点点!在第二篇方法调用中,我们主要学习的是确定目标方法,这篇我们就来看看方法内容的具体执行。目前基于虚拟机的语言中,既有编译执行的(以c,c++为代表),也有解释执行的(比如Python,JavaScript等)。下面让我们针对java虚拟机简单分析一下这两种执行的区别。编译执行:编译器将源文件编译成目标机器码文件,运行时不需要重新翻译,下次再运行该文件的时候也无需再次编译。典型的比如...原创 2018-07-04 08:03:18 · 2729 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记16——Javac编译器
由于笔者最近几天小病了一场,几天没有更新了,对朋友们说一声抱歉,同时也提醒亲爱的朋友们,身体是革命的本钱,一点也不假啊!不过笔者现在好了,还能大跳了!还是那句话,每天天进步一点点!在上一篇中,我们讨论编译执行和解释执行中,我们已经分析过了,Java的编译过程划分是没有那么明确的,可能会经过三类编译器的加工。1. 前端编译器:负责把Java文件编译成Class文件,如Sun的Javac;2. 后端运...原创 2018-07-11 08:31:57 · 323 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记14——类加载的准备和解析
每天进步一点点!今天我们一起看一下类加载的准备阶段和解析阶段。先看一下准备阶段:主要任务是在方法区中为类变量(仅static修饰变量,不包含实例变量)分配内存并设置类变量初始化的阶段。这里面的区别,我们通过下面的代码来简单了解一下。我们将上面的代码编译好后,通过字节码工具看一下其中的信息。首先,从上图可以看出,被final修饰的b是直接赋值的。我们再打开classlib,如下图所示,b对应的是一...原创 2018-06-22 08:21:35 · 205 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记13——字节码指令4(其他指令)
我们的口号是:每天进步一点点!上一篇的字段写到属性的时候,由于属性涉及到的内容比较多,我们暂时搁置了,这一篇是Class文件结构的最后一篇,我们就详细说说属性表结合。九、属性(Attribute):从表中看属性部分分为属性个数(attributes_count)和属性信息(attributes),这个已经没什么好说的了(参考前面的文章),这个单独拿出来主要是属性的类型比较多,如下图所属。类中字段...原创 2018-06-14 07:59:41 · 347 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记11——JDK可视化工具-VisualVM以及案例分析
VisualVM:多合一故障处理工具,功能比较全面的一个工具,与其它的检测工具相比,对实际性能影响很小,并且还具备安装插件功能。这个工具和前面介绍的JConsole工具有很多类似的功能,但是比JConsole功能更全面,朋友们可以自己到JDK的bin目录下找到jvisualvm.exe进行测试。这里简单介绍两个比较有用的插件。一个是Visual GC,可以堆内存的使用有一个更全面的监控,包括类的编...原创 2018-06-03 13:33:06 · 1143 阅读 · 0 评论 -
深入理解JAVA虚拟机2——对象的创建与访问
有了上一篇的基础深入理解JAVA虚拟机学习笔记1——内存,这一篇我们就来分析一下,代码到底时如何运行的。以下面两段代码为例,包含两个类,一个是用来和大家打招呼的具体业务类Main.java。import java.util.Date;public class Main { private String hello = "Hello World!"; private void...原创 2018-05-23 08:55:10 · 244 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记4——垃圾收集器概述
时隔这么久,这个系列又和大家见面了,感谢支持我的朋友,只要能给大家带来一点点收获,我真的时发自内心的开心!今天先简单了解一下虚拟机的垃圾收集器。前面已经介绍过了,程序计数器,虚拟机栈和本地方法栈是属于线程私有区域,这三个区域分配和回收都是确定的,方法和线程结束后,内存自认而然就回收了。而Java堆和方法作为公共区域回收则比较复杂,垃圾收集器所关注也是这两个部分的内存。但是如何判断哪些对象应该被回收...原创 2018-05-28 08:37:14 · 196 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记5——垃圾收集算法
话不多说,直接上内容,书中介绍了四种算法。1. 标记-清除算法:这是最基础的算法,后续的算法都是在此算法基础上做出的改进。该算法包括两个过程:标记——将对象回收状态进行标记,这个在以前的笔记中已经做了介绍,这里不再赘述。清除——回收的时候直接将标记为可回收的对象清除。缺点:1.1效率问题:标记和清除两个过程的效率都不高;1.2. 空间问题:从图中可以看出,回收之后的内存上产生了大量不连续的内存碎片...原创 2018-05-28 09:15:27 · 181 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记12——class类文件结构概述
对于前面的学习,笔者认为属于第一阶段,一直都在说虚拟机内存分配和垃圾收集的问题,由于这些都是开发的过程中看不见又不常用得,不那么容易理解。从这一篇开始,我们迎来了第二阶段,这一阶段的知识,将会和我们的代码紧密联系起来。每一个学习JAVA的人,相信都听过一个诱人的口号“Write once, run anywhere”,JAVA是怎么实现的,简单来说,在不同的平台上有不同的虚拟机,虚拟机会将生成的...原创 2018-06-04 08:22:30 · 216 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记3——OutOfMemoryError异常
开门见山。为了方便制造溢出,将JAVA堆的大小调整为10M。本机用的是IntelliJ IDEA作为开发工具,进入到IDEA的安装目录,如D:\tools\IntelliJ IDEA 2017.1.4\bin,打开idea64.exe.vmoptions文件(32位的请打开idea.exe.vmoptions),把-Xms(最大堆内存)和-Xmx(初始化对内存大小)都设置成10M,书上说设置成一样...原创 2018-05-24 08:25:53 · 189 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记12——Class类文件的结构(1常量池)
前一篇文章已经对Class类文件匆匆一瞥,上一篇没看的,建议先看一下上一篇,这一篇就看一下具体的细节。我们先随便创建一个类,代码如下。运行main方法,这个时候会生成一个class文件,我们用文本编辑器打开它。由于class文件中是二进制流,直接打开会显示一堆乱码,为了方便查看,我们以16进制编码格式打开文件,需要借助一下插件。笔者用的是Nodepad++,在菜单栏中找到“插件”,依次选择“Pl...原创 2018-06-05 11:30:23 · 346 阅读 · 1 评论 -
深入理解JAVA虚拟机学习笔记6——七种垃圾收集器介绍和对比
本来这一篇应该是和大家分享以下HotSpot的算法实现的,但是有部分内容存在一些疑问,还需进一步研究一下,今天就简单介绍一下几种不同的垃圾收集器。开始之前有几点需要提前介绍一下。第一点,书中提到了一个词,“Stop The World”——即当进行垃圾收集的时候,必须暂停其它所有的工作线程。第二点,Java的HotSpot虚拟机有两种工作模式,Client模式(轻量级)和Server模式(重量级)...原创 2018-05-29 21:13:58 · 490 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记12——Class类文件的结构(2访问标志, 继承, 实现)
各位朋友,上一篇的常量池都掌握了吧,我们的口号是:每天进步一点点!开始之前,我们先巩固并扩充一下昨天的知识,用Excel表示一下就是这样的(请原谅笔者low到爆的画图水平,画这种图有什么好的工具,朋友们可以推荐一下啊)。请注意!!!这里有个地方需要补充个一下,那就是当常量的类型是CONSTANT_Utf8_info的时候,看一下它的类型,length是它的字符串长度,意思是代表有多少个bytes...原创 2018-06-06 08:19:25 · 188 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记14——类加载的验证过程
每天进步一点点!上一篇已经学习了加载阶段,这一篇我们了解一下验证的过程。我们已经知道了,虚拟机加载的是Class字节码文件,我们也通过工具查看了文件中存储的是二进制流。下面我们打开一个文件AppTest.class,我们在文件的开头随便加入一个字母“f”,如下图所示。那么,我们通过命令行输入命令“java AppTest”,会出现什么结果呢?虚拟机会报一个Class文件格式化错误,这是我们随便修...原创 2018-06-21 08:20:15 · 385 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记7——内存的分配与回收策略
今天的内容主要是内存的分配,其实前面已经介绍了很多,就当作是复习吧。大家现在应该都知道了,JAVA虚拟机在堆中存放对象实例,所以对象的内存分配也主要是在堆上进行。堆中又分新生代和老年代(有疑问的可以看一下以前的文章),对于新创建的对象,按照对象的大小,大的对象直接进入老年代,小的对象进入新生代。新生代一般又有两类区域,Eden区和Survivor区,Survivor区是用来存放垃圾收集后的存活对象...原创 2018-05-30 20:33:59 · 183 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记12——Class类文件的结构(3字段和方法)
新的一天,新的开始。我们的口号是:每天进步一点点!在这几天的学习当中,不知道大家有没有一个疑惑,就是对“描述符”这个词不太理解,所以笔者前几篇写的时候尽量没用这个词。经过笔者艰苦卓绝的查找,终于大致理解了它的意思:我们要站在虚拟机的角度看这个问题。比如说给我传进来一个类的字段:private String a = "a";那我要知道这个字段叫什么名字(a),然后我要知道它的修饰限定符(priva...原创 2018-06-07 08:28:39 · 168 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记8——HotSpot的算法实现
这一篇应该是在垃圾收集器那一篇之前的,当时由于有些地方不太理解,一直搁置了,几天写出来,仍然有很多自己揣测的地方,看的朋友可以有选择的采纳。前面垃圾收集器概述的笔记中已经写过,通过可达性分析算法——是否有到达GC Roots的引用链来判断,对象是否可以被回收。对象之间的引用在类的成员变量初始化以及类的方法中都会出现,如果逐个遍历,会消耗很多时间。虚拟机是怎么做的呢?使用一组OopMap来记录对象...原创 2018-05-31 08:58:20 · 327 阅读 · 0 评论 -
深入理解JAVA虚拟机学习笔记15——字节码执行引擎(动态类型语言与lambda表达式)
每天进步一点点!在我们刚接触Java时候,我们就被告知,Java是一门静态类型语言。随着开发技术的发展,出现了更多的动态语言,比如我们耳熟能详的Groovy,List,Python,Ruby,JavaScript等。这也就迫使Java需要做出改变,从jdk7开始,Java提供了对动态类型语言的支持,引入了invokedymanic指令提供对动态类型语言的支持。随之在jdk8开始,推出了lambd...原创 2018-06-29 08:27:26 · 570 阅读 · 0 评论