![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 71
MonkeyDCoding
在csdn划水的程序猿
展开
-
JVM:垃圾收集器和内存分配策略
本文参考周志明老师的《深入理解Java虚拟机》一.对象已死?1.引用计数法给对象添加一个引用计数器,每当有一个地方引用他时,计数器值加一,引用失效减一。为0时不可再被使用。2.可达性算法GCRoot选择:①虚拟机栈帧中引用的对象②方法区类静态属性应用对象③方法区常量引用对象④本地方法栈中引用对象。3.生存?还是死亡?可达性分析不可达,JVM会给对象做标记。如果fin...原创 2018-08-03 16:31:55 · 170 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(十)异常处理及结束
第十章 异常处理10.1 异常概述java中,异常可分为:Checked异常和Uncheecked异常。Unchecked异常包括java.lang.RuntimeException、java.lang.Error及他们的子类。其他的异常都是Checked异常。所有的异常都要继承自java.lang.Throwable。如果一个方法有可能导致Checked异常抛出,则该方法要么需要...原创 2018-08-01 13:04:49 · 297 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(九)本地方法调用
第九章 本地方法调用想要运行Java程序,出了Java虚拟机外,还需要Java类库的配合。Java虚拟机和Java类库一起构成了Java运行环境。Java类库主要用Java语言编写,一些无法用Java语言实现的方法则使用本地语言编写,这些方法叫做本地方法。9.1注册和查找本地方法在开始实现本地方法之前,需要先实现一个本地方法注册表,用来注册和查找本地方法。把本地方法定义成为一个函数...原创 2018-08-01 11:44:32 · 620 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(八)数组和字符串
第八章 数组和字符串8.1数组概述如果数组元素是基本类型,就称之为基本类型数组,否则,如果数组元素是引用类型,就称之为引用类型数组。基本类型数组肯定都是一维数组,如果引用类型数组元素也是数组,那么它就是多维数组。在jvm中,数组类和普通的类是不同的。首先,普通的类从class问价加载,但是数组类由jvm在运行时生成。数组类名是左方括号+数组的类型描述符;数组的类型描述符就是类名本身。比...原创 2018-08-01 10:00:37 · 233 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(七)方法调用和返回
第七章 方法调用和返回本章将实现方法调用和返回。还会讨论类和对象的初始化。7.1 方法调用概述从调用的角度来看,方法可以分为两类,静态方法(或类方法)和实例方法。静态方法通过类来调用,实例方法则通过对象引用来调用。静态方法是静态绑定的,也就是说,最终调用的是哪个方法在编译期就已经确定;而实例方法支持动态绑定,最终要调用哪个方法需要到了运行期才知道。从实现角度,可以分为:抽象方法,J...原创 2018-07-31 19:38:23 · 394 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(六)类和对象
第六章 类和对象本章实现线程共享的运行时数据区,包括方法区和运行时常量池。并且根据第三章对.class文件的解析,继续优化转换以放入方法区以供后续使用。本章还有讨论类和对象的设计、实现一个简单类加载器、实现类和对象的部分指令(对第五章进行扩充)。6.1 方法区方法区主要从class文件获取类的信息。此外,类变量也存放在方法区里。到jvm第一次使用这个类的时候,它会搜索类路径,找到对...原创 2018-07-31 16:10:41 · 402 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(五)指令集和解释器
第五章 指令集和解释器本章基于第三章(解析.class文件)和第四章(运行时数据区),编写一个建议的解释器。5.1 字节码和指令集每一个类或者接口都可以被Java编译器编译成为一个.class文件,类或接口的方法信息就放在.class文件的method_info结构中。如果方法不是抽象的,也不是本地方法,方法的Java代码就会被编译器便已成为字节码(即使是空的,也有回一条return语...原创 2018-07-31 14:55:38 · 749 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(四)运行时数据池
第四章 运行时数据池本章来初步实现运行时数据区。4.1 运行时数据区概述运行时数据区可以分为两类:多线程共享,线程私有。多线程共享的运行时数据区需要在java虚拟机启动时创建好,在jvm退出时销毁;线程私有的则随线程生而生,随线程亡而亡。多线程共享的内存区域存放两类数据:类数据和类实例(即:对象)。类数据是放在Method Area中的,对象数据是放在Heap中的。堆由垃圾收集器定...原创 2018-07-31 01:57:28 · 445 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(三)解析.class文件
第三章 解析.class文件本章与.class文件结构息息相关。笔者将以书中顺序解释jvm思想。3.1 .class文件.class文件是类(或接口)信息的载体,每一个.class文件都完整定义了一个类。虽然jvm规范对从哪里加载class文件给与足够的自由,但是却对.class文件的结构给了严格定义。可以把.class文件当作字节流,但是很不方便,所以将其取出设置成byte[]数...原创 2018-07-31 00:32:56 · 281 阅读 · 0 评论 -
JVM:线程安全与锁优化
本文参考周志明老师的《深入理解Java虚拟机》一.Java语言中的线程安全1将java语言中各种操作各种操作共享的数据分为:a.不可变:一定是线程安全的。final修饰。b.绝对线程安全:调用时不需要额外控制即可完成同步。c.相对线程安全:需要额外控制手段。d.线程兼容:使用同步手段保证对象并发下安全使用。e.线程对立:就算用了同步措施也没ruan用。2.线程安全实...原创 2018-08-04 12:20:13 · 438 阅读 · 0 评论 -
JVM:JMM与线程
本文参考周志明老师的《深入理解Java虚拟机》一.硬件的效率与一致性二.JMM1.主内存和工作空间JMM主要是定义程序中各个变量访问规则。所有变量都存储在主内存。每条线程还有自己的工作内容。线程工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线...原创 2018-08-04 11:41:17 · 329 阅读 · 0 评论 -
JVM::晚期(运行期)优化
本文参考周志明老师的《深入理解Java虚拟机》一.HotSpot即时编译器1.解释器和编译器快启动——解释器快执行——编译器分层编译:第0层:解释执行。第1层:将字节码编译为本地代码。(更快的速度)第2层:基于第一层的优化。(更高的质量)2.编译对象和触发条件3.编译过程二.编译优化技术1.基本套路第一步:方法内联。第二步:冗...原创 2018-08-04 10:27:18 · 281 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(二)搜索class文件
第二章 搜索class文件在加载类前,需要加载它的父类。本章主要讲述的是对于一个java类对应的class文件搜索。2.1类路径1.这里涉及到jvm的类路径有三种:①.bootstrap classpath从jre\lib加载②.extension classpath从jre\lib\ext加载③.application classpath从三方类库加载有没有想起jvm...原创 2018-07-30 18:14:01 · 410 阅读 · 0 评论 -
《自己动手写Java虚拟机》学习笔记(一)命令行工具
作者代码github传送笔者语:在2017年11月份,有幸读到了张秀宏老师的《自己动手写Java虚拟机》。正巧看完了周志明老师的《深入理解java虚拟机》,所以决定自己动手实现一个。随着张老师的代码不断深入,自己写到第六章(类和对象)的时候卡住了(挂在了莫名奇妙的bug上)。这几天才腾出了时间,打算整理一下学习笔记并继续完成这个简单jvm。全书一共十一章。分别为第一章:命令行工具...原创 2018-07-30 17:26:04 · 1149 阅读 · 0 评论 -
JVM::早期(编译期)优化
本文参考周志明老师的《深入理解Java虚拟机》一.Javac编译器1.解析与填充符号表a.解析:parseFiles();词法分析将源代码的字符流转化为标记(Token)集合。语法分析根据Token序列构造抽象语法树。b.填充符号表:enterTress();符号表是K—V键值对的形式。2.注解处理器如果注解处理器在处理注解的时候对语法树进行了修改,编译器将...原创 2018-08-04 02:41:17 · 375 阅读 · 1 评论 -
JVM:虚拟机类加载机制
本文参考周志明老师的《深入理解Java虚拟机》一.类加载的时机加载不一定发生在什么时候,但是遇到这种情况下必须马上对类进行初始化(当然加载验证等工作要在此之前已经完成):a.new、putstatic、getstatic、invokestatic。如果类还没有初始化就要先初始化。b.反射。c.对一个类初始化时,其父类没有被初始化,先初始化父类。d.虚拟机启动时。需要加载...原创 2018-08-03 18:16:00 · 214 阅读 · 0 评论 -
JVM:自动内存管理机制
本文参考周志明老师的《深入理解Java虚拟机》一.运行时数据区1.虚拟机栈、本地方法栈、程序计数器是线程私有的。堆和方法区是线程公有的。2.PC:可以看作是当前线程所执行的字节码的行号指示器。3.Java虚拟机栈:线程私有。 内部是栈帧(包括:局部变量表,操作数栈,动态连接,方法出口等信息)。每一个方法从执行直至完成的过程,都对应着一个栈帧在虚拟机栈中入栈到出栈的过程。4....原创 2018-08-03 15:28:43 · 231 阅读 · 0 评论