随笔分类 -  深入java虚拟机

摘要:-Xms 为jvm启动时分配的内存,比如-Xms200m,表示分配200M -Xmx 为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存 -Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M -xmn 设置新生代大小 阅读全文
posted @ 2019-12-09 16:34 shyroke、 阅读(309) 评论(0) 推荐(0) 编辑
摘要:一、什么是栈 二、运行原理 阅读全文
posted @ 2019-12-09 12:52 shyroke、 阅读(113) 评论(0) 推荐(0) 编辑
摘要:分派调用 其实分派分为两种,即动态分派和静态分派。我们在了解分派的时候,通常把它们与重写和重载结合到一起。 重载(overload)与静态分派 我们先看一个题: public class Main { static abstract class Father { } static class Son 阅读全文
posted @ 2018-06-12 23:07 shyroke、 阅读(278) 评论(0) 推荐(0) 编辑
摘要:方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还没有涉及到方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍最频繁的操作,但Class文件的编译过程不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法 阅读全文
posted @ 2018-06-12 17:29 shyroke、 阅读(151) 评论(0) 推荐(0) 编辑
摘要:栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。第一个方法从调用开始到执行完成,就对应着一个栈帧在虚拟机栈中从入 阅读全文
posted @ 2018-06-12 16:39 shyroke、 阅读(214) 评论(0) 推荐(0) 编辑
摘要:一、Java虚拟机启动、加载类过程分析 下面我将定义一个非常简单的java程序并运行它,来逐步分析java虚拟机启动的过程。 2. 创建一个引导类加载器实例,初步加载系统类到内存方法区区域中; 3. 创建JVM 启动器实例 Launcher,并取得类加载器ClassLoader; 5. 加载完成时候 阅读全文
posted @ 2018-06-11 23:52 shyroke、 阅读(449) 评论(0) 推荐(0) 编辑
摘要:一、概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 与那些在编译时需要进行链接工作的语言不同,在Java语言里,类型的加载、连接和初始化过程都是在程序运行期间完成的,例如import j 阅读全文
posted @ 2018-06-09 22:19 shyroke、 阅读(1108) 评论(0) 推荐(1) 编辑
摘要:一、异常处理指令概念 二、同步指令概念 阅读全文
posted @ 2018-06-09 21:29 shyroke、 阅读(154) 评论(0) 推荐(0) 编辑
摘要:一、概念 阅读全文
posted @ 2018-06-09 21:04 shyroke、 阅读(209) 评论(0) 推荐(0) 编辑
摘要:一、概念 二、案例 源代码 源代码 javap -verbose Test.class 解析如下,当程序运行到if语句时,执行if_icmple指令,判断(age>10)是否成立,如果成立则继续执行,如果不成立则跳转到20行继续执行,即跳转到getstatic指令。 阅读全文
posted @ 2018-06-09 20:38 shyroke、 阅读(205) 评论(0) 推荐(0) 编辑
摘要:一、概念 虽然类实例和数组都是对象,但 Java 虚拟机对类实例和数组的创建与操作使用了不同的字节码指令: 创建类实例的指令:new 创建数组的指令:newarray,anewarray,multianewarray 访问类字段(static 字段,或者称为类变量)和实例字段(非 static 字段 阅读全文
posted @ 2018-05-21 21:01 shyroke、 阅读(222) 评论(0) 推荐(0) 编辑
摘要:一、概念 类型转换指令可以将两种 Java 虚拟机数值类型进行相互转换,这些转换操作一般用于实现用户代码的显式类型转换操作,或者用来处理 Java 虚拟机字节码指令集中指令非完全独立独立的问题。 Java 虚拟机直接支持(译者注:“直接支持”意味着转换时无需显式的转换指令)以下数值的宽化类型转换(W 阅读全文
posted @ 2018-05-21 17:05 shyroke、 阅读(332) 评论(0) 推荐(0) 编辑
摘要:一、概念 算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。大体上运算指令可以分为两种:对整型数据进行运算的指令与对浮点型数据进行运算的指令,无论是那种算术指令,都是使用 Java 虚拟机的数字类型的。数据没有直接支持 byte、short、char 和boolean 类 阅读全文
posted @ 2018-05-21 15:44 shyroke、 阅读(327) 评论(0) 推荐(0) 编辑
摘要:一、概念 加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输,这类指令包括如下内容。 将一个局部变量加载到操作栈: iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n>。 将一个 阅读全文
posted @ 2018-05-20 23:58 shyroke、 阅读(461) 评论(0) 推荐(0) 编辑
摘要:一、概念 上一章节讲述了方法表,方法体的内容就存放在属性表的“Code”中,如下图。 在Class文件、字段表和方法表都可以携带自己的属性信息,这个信息用属性表进行描述,用于描述某些场景专有的信息。 与Class文件中其它数据项对长度、顺序、格式的严格要求不同,属性表集合不要求其中包含的属性表具有严 阅读全文
posted @ 2018-05-19 23:17 shyroke、 阅读(762) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2018-05-19 22:38 shyroke、 阅读(254) 评论(0) 推荐(0) 编辑
摘要:方法表集合 前面的魔数,次版本号,主板本号,常量池入口,常量池,访问标志,类索引,父类索引,接口索引集合,字段表集合,那么再接下来就是方法表了. 方法表的构造如同字段表一样,依次包括了访问标志(access_flags),名称索引(name_index),描述符索引(descriptor_index 阅读全文
posted @ 2018-05-19 01:11 shyroke、 阅读(282) 评论(0) 推荐(0) 编辑
摘要:一、概念 类索引之后便是字段表集合,如下标,紧跟类索引之后的是fields_count(字段数量)和fileds字段表,各占两个字节。 二、案例 编写一个类,该类有多个字段。如下代码: 编译后,打开字节码文件如下图: 由上图可知,fields_count(字段数量)=0x0004 = 4 表示该类有 阅读全文
posted @ 2018-05-13 14:54 shyroke、 阅读(604) 评论(0) 推荐(0) 编辑
摘要:一、概念 上一章节讲到了访问标志,如下表可知访问标志之后是this_class(这个类)和super_class(父类)和interfaces_count(继承接口的数量)和interfaces(继承的接口),各占2个字节。 二、例子 编写一个类,继承一个类,并实现了多个接口,如下 用javac编译 阅读全文
posted @ 2018-05-13 14:33 shyroke、 阅读(456) 评论(0) 推荐(0) 编辑
摘要:一、概念 上一章节讲到了常量池,如下图,常量池之后便是访问标志acess_flags,占2个字节(u2)。 二、例子 编写一个接口。 编译之后,用javap命令行打开,可看到访问标志Access_flags。 如上面橙色标记,可知访问标志值为:flags: ACC_PUBLIC, ACC_INTER 阅读全文
posted @ 2018-05-13 13:43 shyroke、 阅读(812) 评论(0) 推荐(0) 编辑

作者:shyroke 博客地址:http://www.cnblogs.com/shyroke/ 转载注明来源~