每日一问:你了解 Java 虚拟机结构么?
对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码。而对于我们 Android 乃至 Java 程序员,却总是会因为虚拟机的自动内存管理机制而忽视内存管理的重要性。
经过前面简短的几篇纯 Android 问题,我想再给大家掺杂一点可能平时你并没有太多关注的东西。其实写这个的时候我相当纠结,因为对于大多数 Android 开发来说,他们会更加注重实质性的技能提升,而不是我今天将要讲的 Java 虚拟机结构。
但经过一系列的思想斗争,我还是打算把这个讲到底,为了不浪费大家太多的时间,我依然遵从「每日一问」系列的初衷,我们尽可能地精简文字,让每一个小知识点阅读时间都控制在 5 分钟以下。
Java 虚拟机结构作为一个面试高频考点,你完全可以当做你在复习面试知识,这样兴许你的学习的心态会好一些。

我还是不得不去网上摘下了这个图,我想唯有用这张图结合讲解起来才更加的通俗易懂。
Java 虚拟机内存区域确实就由这几部分构成:方法区、虚拟机栈、本地方法栈、堆、程序计数器。
程序计数器
程序计数器是一个较小的内存空间,线程私有,它是唯一一个在 Java 虚拟机规范中没有规定任何 OOM 情况的区域。
虚拟机栈
虚拟机栈和程序计数器一样,同样为线程所私有,并且生命周期和线程相同。。每个栈中的数据都是私有的,其他栈不允许访问,每个方法被执行的时候都会同时创建一个栈帧,每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈从入栈到出栈的过程。虚拟机栈主要存放各种编译期可知的基本数据类型和对象的引用。
本地方法栈
本地方法栈与虚拟机栈发挥的作用非常相似,其主要区别是虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地房发展则是为虚拟机用到的 Native 方法服务。
Java 堆
Java 堆是垃圾收集器管理的主要区域,主要用于存放对象的实例,自然而然就成了 Java 虚拟机中管理内存最大的一块,并且它可以处于物理上不连续的内存空间中,Java 堆在虚拟机启动的时候就进行创建,并被所有线程所共享。
方法区
方法区和 Java 堆一样,是各个线程共享的内存区域,主要存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的回收和对类型的写在,较少发生垃圾收集行为。
上面对 Java 虚拟机结构进行了非常精简的讲解,大家可还对此清晰了一些?如果还是没有太透彻其实没有关系,多回顾几遍,最好能自己画一个图,在一边进行理解。明天我们再来讲一讲我们另外一个面试非常高频的考点:垃圾回收算法,一起来探究 Java 虚拟机到底是怎么来回收一个无用的对象的。
每日一问:你了解 Java 虚拟机结构么?的更多相关文章
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- 【Java虚拟机结构(第1部分)数据类型】摘要
<Java虚拟机规范(Java SE 7版)>作者:Tim Lindholm.Frank Yellin.Gilad Bracha.Alex Buckley 摘要:第二章 Java虚拟机结构 ...
- JVM规范系列第2章:Java虚拟机结构
本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...
- Java虚拟机 - 结构原理与运行时数据区域
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...
- Jvm运行时数据区 —— Java虚拟机结构小记
关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...
- Java虚拟机结构
一.JVM主要的结构如下: 二.各个区域功能介绍 1).方法区(Method Area): (1)用于存储虚拟机加载的类信息.常量.静态变量等,是各个线程共享的内存区域: ...
- The Structure of the Java Virtual Machine Java虚拟机结构 虚拟机内存模型
小结: 1.实现一台Java虚拟机,只需正确读取class文件中的每一条字节码指令且能正确执行这些指令所蕴含的操作. 2.设计者决定:运行时数据区的内存如何布局,选择哪种垃圾收集算法,是否对虚拟机字节 ...
- java虚拟机规范(se8)——java虚拟机结构(三)
2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是 ...
- java虚拟机规范(se8)——java虚拟机结构(二)
2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区 ...
随机推荐
- docker系列之二:构建docker容器
1.创建在FlaskApp/app中创建Flask项目: 2.生成web项目所需的运行环境:pip3 freeze > ../requirements.txt 3.编辑Dockerfile: # ...
- C#将运算字符串直接转换成表达式且计算结果
DataTable dt = new DataTable(); var Result= dt.Compute("1+2*3+2", "");//将运算字符串转换 ...
- C#多线程下如何保证线程安全?
多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题.所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是 ...
- python \r与\b的应用、光标的含义
参考链接:https://www.jianshu.com/p/eb5c23cd6e34 \r 能将光标定位到当前行的行首 \b则是将光标回退一位 光标的含义: 光标后面的输出内容均会消失,光标回退后, ...
- iOS11里判断Safari浏览器是无痕模式还是正常模式?
var isPrivate = false; try { window.openDatabase(null, null, null, null); } catch (_) { isPrivate = ...
- Vue开发日志
一 搭建环境 mac 安装node brew install node 安装vue 全家桶 npm install -g vue-cli 选择一个目录做初始化 vue init webpack myp ...
- Activity + 基础UI
目录 Activity + 基础UI 1. 返回键退出进入应用: 2. home键以后 3. home键退出切换字体 二:AndroidManifest配置theme改变UI效果 三:UI 报错: A ...
- 第09节-使用BTStack编写蓝牙程序
Bluetooth LE Exploer(微软提供的)可以读取BLE蓝牙设备,可以读写它的值.本篇博客将使用BTStack写出一个精简版的Bluetooth LE Exploer. 涉及文件: bts ...
- phpcms邮箱smtp配置163企业邮测试可用
前面我们给phpcms加了https,但是修改邮箱smtp配置一直提交不了,提示请填写接口地址,格式为:http://www.abc.com,结尾不包含"/",找了一下phpsso ...
- 数组问题:a与&a有的区别
int a[5] = {0,1,2,3,4};这种用法还是比较常见的. #include <stdio.h> int main(void) { int a[5] = {0,1,2,3,4} ...