昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前,我们一定得确定哪些是活着的对象,又有哪些是可以进行回收的. 判断对象是否存活方式 引用计数算法 对应判断一个对象是否可以回收,我想引用计数一定是最容易被想到的算法了吧.给每个对象加一个引用计数器,每当有一个地方引用它时,计数器就加 1,引用失效后减 1,当对象的计数器为 0,则说明这个对象可以被回…
对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员,却总是会因为虚拟机的自动内存管理机制而忽视内存管理的重要性. 经过前面简短的几篇纯 Android 问题,我想再给大家掺杂一点可能平时你并没有太多关注的东西.其实写这个的时候我相当纠结,因为对于大多数 Android 开发来说,他们会更加注重实质性的技能提升,而不是我今天将要讲的 Java 虚拟机…
<Java虚拟机规范(Java SE 7版)>作者:Tim Lindholm.Frank Yellin.Gilad Bracha.Alex Buckley 摘要:第二章 Java虚拟机结构(第1部分) 本规范描写叙述的是一种抽象化的虚拟机的行为,而不是不论什么一种被广泛使用的虚拟机实现. 2.1 Class 文件格式 编译后被Java虚拟机所运行的代码使用了一种平台中立(不依赖于特定硬件及操作系统的)的二进制格式来表示,而且常常(但并不是绝对)以文件的形式存储.因此这样的格式被称为Class文…
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为的描述,而不是具体虚拟机的实现. 所有在虚拟机规范之中没有明确描述的实现细节,都不应成为虚拟机设计者发挥创造性的牵绊,设计者可以完全自主决定所有规范中不曾描述的虚拟机内部细节,例如:运行时数据区的内存如何布局.选用哪种垃圾收集的算法.是否要对虚拟机字节码指令进行一些内部优化操作(如使用即时编译器把字…
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Ja…
关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章“Java虚拟机结构”的思维导图. 需要注意的是,规范并非具体实现.如S0,S1,Eden区的划分…都属于jdk的具体实现了… 虽然一些小细节自己记了笔记,但xmind导出png似乎不会显示……
一.JVM主要的结构如下: 二.各个区域功能介绍 1).方法区(Method Area):         (1)用于存储虚拟机加载的类信息.常量.静态变量等,是各个线程共享的内存区域:         (2)默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小:         (3)方法区中还有一部分是运行时常量池,主要用来存储编译时生成的字面量和符号引用,常量也可以在运行时产生,如String的intern方法:…
小结: 1.实现一台Java虚拟机,只需正确读取class文件中的每一条字节码指令且能正确执行这些指令所蕴含的操作. 2.设计者决定:运行时数据区的内存如何布局,选择哪种垃圾收集算法,是否对虚拟机字节码指令进行一些内部优化操作(如何用即时编译器把字节码编译为机器码) 3.请注意避免混淆Stack.Heap和Java(VM)Stack.Java Heap的概念.Java虚拟机的实现本质上是由其他语言所编写的应用程序,Java语言程序里分配在Java Stack中的数据,从实现虚拟机的程序角度上看则…
2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是意外结束(抛出了未被捕获的异常).栈帧分配在线程创建的虚拟机栈中.每个栈帧都有自己的局部变量表,操作数栈,以及当前方法的类的运行时常量池的引用. 可以使用附加的特定于实现的信息来扩展帧,例如调试信息 局部变量表和操作数栈在编译时期就确定了,并且通过栈帧关联的方法的code提供.因此栈帧的大小仅仅取决…
2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区域随着线程的创建而创建,随着线程的退出而销毁. 2.5.1 pc寄存器 java虚拟机支持多个线程同时执行.每个线程拥有自己的pc(program counter)寄存器.在任何时刻,一个线程只会执行一个方法,即线程的当前方法.如果执行的方法不是本地(native)方法,pc寄存器包含当前正在执行的…