jvm读书笔记
文章平均质量分 87
凯哥多帅哦
当编程成为一种习惯
展开
-
《深入理解java虚拟机》读书笔记——jvm内存区域
java虚拟机所管理的内存将会包括下列几个运行时数据区域:方法区:1、用于存储已被虚拟机加载的类信息、常量、静态变量和即时编译器编译后的代码等数据。2、垃圾收集在这个区域较少出现,主要是针对常量池的回收和类型的卸载,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常(OOM)。3、该区域被线程共享。4、运行时常量池是方法区的一部分,用于存放编原创 2017-06-24 11:54:04 · 560 阅读 · 0 评论 -
《深入理解java虚拟机》读书笔记——OOM发生的原因及解决方案
除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OOM的可能,如果能够区分根据报错区分出是哪些区域报出来的异常,会更便于定位问题,解决问题。原创 2017-06-24 13:26:12 · 336 阅读 · 0 评论 -
《深入理解java虚拟机》读书笔记——GC与内存分配策略
一、垃圾收集器如何判断堆里的哪些对象需要回收1、引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用,作为"死对象"被垃圾收集器回收。主流的java虚拟机没有选用引用计数算法来管理内存,主要的原因是它很难解决对象之间循环引用的问题。比如对象A和对象B都有字段obj,其中A.obj = B且B.obj = A,除此之外无其他引用,引用计数算法无法通知垃圾收集器回收它们,因为它们相互引用,彼此的引用计数都不原创 2017-06-24 18:42:17 · 404 阅读 · 0 评论 -
《深入理解java虚拟机》读书笔记——运行时栈帧结构
栈帧是用于虚拟机进行方法调用和方法执行的数据结构,是虚拟机栈的栈元素。每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。每一个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。在编译程序代码的时候,栈帧需要多大的局部变量表,多深的操作数栈都已经完全确定,并且写入到方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的原创 2017-06-27 14:20:14 · 472 阅读 · 0 评论 -
《深入理解java虚拟机》读书笔记——垃圾收集器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合出各个年代所使用的收集器。转载 2017-06-26 23:11:28 · 346 阅读 · 0 评论 -
《深入理解java虚拟机》读书笔记——方法的解析调用与分派调用
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(即直接引用)。这个特性需要在类加载期间,甚至到运行期间才能确定目标方法的直接引用。原创 2017-06-27 17:01:49 · 664 阅读 · 0 评论 -
《深入理解java虚拟机》读书笔记——类加载机制
什么情况下开始类加载阶段的第一个阶段:加载?java虚拟机并没有进行强制约束,这点交给虚拟机的具体实现来自由把握。但是对于初始化阶段,虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行初始化(主动使用)。1、使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候,以及调用类的静态方法的时候。2、使用java.lang.reflect包的方法对类进行反射调用的时候(如Class.forName("con.xx.Test"))原创 2017-06-25 10:51:23 · 545 阅读 · 0 评论