深入理解Java虚拟机阅读心得(二)】的更多相关文章

垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有的对象实例,垃圾收集器进行对堆的回收之前,需要判断这些对象是否还存活 一.判断对象是否存活 判断对象是否还活着,主要有两种方法 1.引用计数法 给对象添加一个引用计数器,每当一个地方引用时,计数器值加1: 每当一个引用失效时,计数器减1: 任何计数器为0的对象为不可能被使用的对象. 优点:实现简单,…
JVM(Java Virtual Machine) 即Java虚拟机,是一种用于计算设备的规范,用于运行Java程序编译后得到的字节码文件(Class文件) 一.JVM的内存区域 1.程序计数器(Programing Counter Register) 用于选取需要JVM执行的字节码指令,最简单的一种方法就是通过修改程序计数器的值来达到选取下一条需要执行的字节码指令的目的. 如在多线程中CPU时间片切换时,可以通过线程私有的程序计数器来知道这次应当执行的是哪一条字节码指令. 每个线程都会有一个独…
垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就加1,当引用失效就减1,任何时刻计数器为0的对象就是不可能再被引用的.但是它很难解决对象之间相互循环引用.所以在主流的Java虚拟机里没有用引用计数算法来管理内存. 3.可达性分析算法是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Refer…
Java中提倡的自动内存管理最终可以归结为自动化的解决两个问题: 给对象分配内存 回收分配给对象的内存 先说说回收这一方面的两个主要知识点 一.垃圾收集算法 1.标记-清理算法 首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象(适用老年代) 两个缺陷:(1)效率问题,标记和清除两个过程效率都不高 (2)空间问题,标记清除算法会产生大量不连续的内存空间碎片,导致无法分配较大对象 2.复制算法 将可用内存按容量划分为等大小的两块,每次只使用其中的一块.清理时将还存活着的对象复制…
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机在Java程序运行时会将内存区域划分成若干个不同的区域,各自负责不同的职责,这些区域都有各自的用途. Java虚拟机运行时数据区分为以下几个部分. 方法区.虚拟机栈.本地方法栈.堆.程序计数器,如下图所示: 图片来源于网络如有侵权请私信删除 2.2.1 程序计数器 程序计数器是一块较小的内存空间,可以看作当前…
无符号数.表 当实现了不同语言的编译器,比如jython,jruby等等,那么就可以利用这些语言编写代码,通过各自的编译器编译成符合jvm规范的字节码文件,就可以利用jvm来执行了. Class文件在Java体系结构中的位置和作用 在上一篇博客中, 大致讲解了Java虚拟机的体系结构和执行原理. 本篇博客主要讲解能够被JVM识别, 加载并执行的class文件的格式. 对于理解JVM和深入理解Java语言, 学习并了解class文件的格式都是必须要掌握的功课. 原因很简单, JVM不会理解我们写的…
Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行执行位置的计算来实现的.程序计数器的内存空间是每条线程独有的,也称之为“线程私有”的内存:计数器记录的是正在运行的字节码指令的地址,而如果是Native方法(本地方法),则计数器的值为空(Undefined).此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况…
虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是在程序运行期间完成的. 一.类的生命周期: 类从加载到内存,直至从内存中卸载.整个生命周期如下图: 其中,加载.验证.准备.初始化.和卸载这5个阶段的顺序是确定的. 二.类加载的时机: Java并没有规定什么时候对类进行加载,但是规定了有且只有5中情况,要对类进行加载: new实例化对象时.读取或者…
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的区域. 2. Java虚拟机栈 线程私有. 描述Java方法的内存模型——栈帧(局部变量表.操作数栈.动态链接.方法出口).每个方法从调用到执行完成,对应一个栈帧入栈到出栈的过程. 异常:StackOverflowError和OutOfMemoryError异常 3.本地方法栈 线程私有. 本地方法…
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2.虚拟机栈 占用空间:依据栈空间设定 作用:java 方法执行的内存模型. 作用详情:每个方法执行时都会创建栈桢.用于储存局部变量表.栈操作数.动态链接.方法出口等信息.每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈的过程 特点:线程私有 3.本地方法栈 本地方法栈(Native Met…