
Java虚拟机解析
文章平均质量分 81
用尽可能平民话的语言和图解来清楚的解释Java虚拟机的运行方式。(参考深入理解JVM虚拟机)
胖子程序员
穷学生一个
展开
-
[jvm解析系列][十四]动态代理和装饰模式,带你看源码深入理解装饰模式和动态代理的区别。
不知道大家知不知道设计模式中有一种叫做装饰,举一个简单的例子。一天一个年轻领导小王讲话:咳咳,我们一定要xxx抓紧xxxx学习xxx的精神!好,今天的会议结束!然后有一个老领导李同志接过来说:那个我在补充两点,个别同志xxx,一定要注意xxx。好散会。然后另一天小王同志又在讲话:xxx两手都要抓,xxxx一定要注意。这个时候老周同志出来了:嗯,小王讲的很好,我还有几点要补充xxxx原创 2016-06-16 19:26:07 · 2789 阅读 · 1 评论 -
[jvm解析系列][十三]字节码指令小节,从字节码看JVM的栈解释器执行过程。
众所周知,JVM以前一直采用的是解释执行,但是后来在历代的版本更迭中也加入了编译执行。所以总的来说JVM是包含了解释执行和编译执行。这一部分不属于JVM的范畴了,已经属于编译了,大多数都是进行词法分析之类的,以后有时间会补充。同时大家都知道现在大体上分为两种指令集架构,第一种就是基于栈的第二种是基于寄存器的,简单点说,基于寄存器的架构速度更快,但是可移植性不强,但是基于栈的指令集架构虽然慢,但原创 2016-06-15 10:28:39 · 1836 阅读 · 0 评论 -
[jvm解析系列][十二]分派,重载和重写,查看字节码带你深入了解分派的过程。
重载和重写是分派中的两个重要体现,也是因为这个原因我们才把重载和重写写在了标题上。这一章我们的很多部分都在代码试验上。总的来说分派分为静态分派和动态分派两种。静态分派:首先我们来看一段源码:public class Dispatch { public static void main(String[] args){ Animal a = new Dog();原创 2016-06-14 08:50:08 · 1720 阅读 · 0 评论 -
[jvm解析系列][十一]字节码执行之栈帧,你的字节码是如何运行的?
在之前的章节中我们讲解了jvm的内存分配和管理,class的文件结构,就差之行了。那么从第十一章开始我们就开始讲java虚拟机是如何执行一个class文件的。首先我们应该明确虚拟机是区别于物理机的一种说法,物理机的执行引擎是建立在处理器,硬件 ,指令集之上的。而我们的虚拟机则由自己实现。在虚拟机中大致分为两种执行方式:解释执行和编译执行。我们之前讲过,虚拟机运行方法的时候运行在java虚拟原创 2016-06-13 08:34:33 · 2445 阅读 · 2 评论 -
[jvm解析系列][十]类加载器和双亲委派模型,你真的了解ClassLoader吗?
上一章我们讲到,一个类加载到内存里我们可以操作的部分只有两个,一个是加载部分一个是static{},我相信static{}不用多讲了。接下来我们就来解析一下ClassLoader即类加载器,他就是用来加载字节码到方法区的类。当年出现ClassLoader这个东西动态加载类的字节码主要还是为了满足JavaApplet的需求。虽然后来JavaApplet挂掉了,但是ClassLoader这个形原创 2016-06-12 12:31:54 · 3001 阅读 · 0 评论 -
[jvm解析系列][九]类的加载过程和类的初始化。你的类该怎么执行?为什么需要ClassLoader?
通过前面好几章的或详细或不详细的介绍,我们终于把字节码的结构分析的差不多了。现在我们面临这样一个问题,如何运行一个字节码文件呢?首先,java语言不同于其他的编译时需要进行链接工作的语言不通,java语言有一个很明显的特性,那就是动态加载,一个字节码的加载往往都是在程序运行的时候加载进来的,很多时候这种方式给我们带来了便利。虽然从某种意义上来说他可能消耗了一定的资源降低了性能。类的生命周期原创 2016-06-11 10:25:26 · 2209 阅读 · 0 评论 -
[jvm解析系列][八]方法表集合,Code属性和Exceptions属性,你的字节码存在哪里了?
根据我们第五章的总构图来看,这一章我们正该讲到方法表集合:大家可能注意到在java中声明一个方法和声明一个变量很相似,public int a = 0;和public int a(){};于是在方法表集合中和字段表集合也很相似。一个方法表的结构应当和下图一样:对比字段表应该发现几乎是一样的。access_flags里的可选项略有不同而已。access_flags:原创 2016-06-10 11:30:53 · 4506 阅读 · 0 评论 -
[jvm解析系列][七]字段表集合、volatile、volatile和属性表集合,你的变量该如何存储?
上段我们说到一个类的基本构成,今天我们来讲一下类的内部结构。类的内部一般情况下由类的成员变量(类字段),方法和内部类等构成。1、字段表:不好意思我们这一次需要先上字段表的内容然后一个一个讲解,不能像前面那样像设计者一样一个一个的推出来了,主要原因还是字段表里包含了属性表。access_flags还记得我们在上一篇里讲的,在类的继承关系之后应该就是field_info他主要描原创 2016-06-08 20:38:10 · 1303 阅读 · 0 评论 -
[jvm解析系列][六]class里的常量池,访问标志,类的继承关系,如何把一个类在字节码中描述清楚?
上回我们说到了魔数和版本号,今天我们接着说。为了方便起见,我把那幅图拉过来方便大家看由图可见接下来是一个叫constant_pool_count翻译过来叫常量池数量,前面我们说到class文件中只有两种数据结构,无符号数和表,而且整篇没有分隔符,在没有分隔符的情况下我们怎么区别数量非1的表的分界线呢。(举个例子:图中的constant_pool,我们想想该怎么标记出constant_p原创 2016-06-07 08:35:55 · 1680 阅读 · 0 评论 -
[jvm解析系列][五]类文件结构,魔数,最大最小版本号
上一会讲完了JVM的内存分配和垃圾回收策略我们该讲一讲如何组织一个class文件了一个class文件怎么被加载运行的?我们可以说java的野心很大,早在97年的时候JVM虚拟机规范中就说以后可以支持其他语言,到JDK1.7的时候基本已经实现了,怎么做到的呢?这是JVM做的语言无关性即JAVA/Scala/JRuby等都可以编译成class文件,对于JVM而言我不管你之前什么文件反正我只原创 2016-06-06 09:13:25 · 1971 阅读 · 0 评论 -
[jvm解析系列][四]Java的垃圾回收(二)垃圾收集算法,内存分配和回收策略
上回说到如何鉴别一个垃圾。这回咱们讲讲怎么收集垃圾收集垃圾有几种算法如下:1、标记-清除算法这个算法最为基础,我们先讲算法再说优缺点。实现过程:标记出所有需要回收的对象,当标记完成后统一回收。图解如下:优缺点:可能画出来图的时候大家都发现了,这个算法有一个很明显的问题,那就是大量的不连续的内存碎片,这样的内存碎片遇到大对象分配的时候很可能遇到内存不足的情况,当然原创 2016-06-05 13:27:25 · 598 阅读 · 0 评论 -
[jvm解析系列][三]Java的垃圾回收(一)如何鉴别垃圾,四种引用类型
垃圾回收就想垃圾车,每次天亮就会沿着街区开一圈,把垃圾都带走。有的区域不需要这种垃圾车,也许它们不造垃圾吧,作为一个中级图钉我对这种地区很无奈,但是它们就是很少有垃圾甚至没有垃圾。首先应该是程序计数器,这玩意要什么垃圾回收,我都不用讲。下一个应该是虚拟机栈本地方法栈,栈帧的进出都受到控制,谁的垃圾谁带走,在进门的时候就算清楚了你要用多少内存,最后你再全部带走一点垃圾也不剩也不需要。(还有一个原原创 2016-06-04 15:23:50 · 971 阅读 · 0 评论 -
[jvm解析系列][二]Java堆的详细讲解和对象的分配过程和访问
上回说到Jvm内存的分配,犹如划地分治,把一块本机内存分裂成了6块。这回我们就讲讲java堆的详细信息java堆里也不是铁板一块,类似jvm的分治,java堆内部也好不到哪里去,大致上可以分成新生代和老年代,他们内部也不和谐,新生代又可以细分为Eden和两个survivor空间。图片如下:是不是看着大小比例很别扭呢,没办法呀,就是按照内存大小画的-。-iii至于他们的作用的,请原创 2016-06-04 14:28:21 · 1153 阅读 · 0 评论 -
[jvm解析系列][一]Java内存区域分配和内存溢出异常OOM
学过操作系统的同学应该比较清楚,一个操作系统必须要有完善的内存管理系统(页/段式的管理),相应的jvm全称java虚拟机应该也有类似的一种管理内存的方式,这种方式是建立在真实的操作系统内存管理方式之上的,他把内存分配成了不同的区域,形成了java内存模型。那么,对于其他博客讲解这种题目要先抛一个图解出来,我并不想这样。因为这种模型的出现肯定是要解决问题的,我们需要顺延着前人设计jvm内存模型的原创 2016-06-02 10:48:18 · 1913 阅读 · 0 评论