对于从事 C/C++ 程序员开发的小伙伴来说, 在内存管理领域非常头疼, 因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码. 而对于我们 Android 乃至 Java 程序员, 却总是会因为虚拟机的自动内存管理机制而忽视内存管理的重要性.
经过前面简短的几篇纯 Android 问题, 我想再给大家掺杂一点可能平时你并没有太多关注的东西. 其实写这个的时候我相当纠结, 因为对于大多数 Android 开发来说, 他们会更加注重实质性的技能提升, 而不是我今天将要讲的 Java 虚拟机结构.
但经过一系列的思想斗争, 我还是打算把这个讲到底, 为了不浪费大家太多的时间, 我依然遵从「每日一问」系列的初衷, 我们尽可能地精简文字, 让每一个小知识点阅读时间都控制在 5 分钟以下.
Java 虚拟机结构作为一个面试高频考点, 你完全可以当做你在复习面试知识, 这样兴许你的学习的心态会好一些.
我还是不得不去网上摘下了这个图, 我想唯有用这张图结合讲解起来才更加的通俗易懂.
Java 虚拟机内存区域确实就由这几部分构成: 方法区, 虚拟机栈, 本地方法栈, 堆, 程序计数器.
程序计数器
程序计数器是一个较小的内存空间, 线程私有, 它是唯一一个在 Java 虚拟机规范中没有规定任何 OOM 情况的区域.
虚拟机栈
虚拟机栈和程序计数器一样, 同样为线程所私有, 并且生命周期和线程相同.. 每个栈中的数据都是私有的, 其他栈不允许访问, 每个方法被执行的时候都会同时创建一个栈帧, 每一个方法被调用直至执行完成的过程, 就对应着一个栈帧在虚拟机栈从入栈到出栈的过程. 虚拟机栈主要存放各种编译期可知的基本数据类型和对象的引用.
本地方法栈
本地方法栈与虚拟机栈发挥的作用非常相似, 其主要区别是虚拟机栈为虚拟机执行 Java 方法 (也就是字节码) 服务, 而本地房发展则是为虚拟机用到的 Native 方法服务.
Java 堆
Java 堆是垃圾收集器管理的主要区域, 主要用于存放对象的实例, 自然而然就成了 Java 虚拟机中管理内存最大的一块, 并且它可以处于物理上不连续的内存空间中, Java 堆在虚拟机启动的时候就进行创建, 并被所有线程所共享.
方法区
方法区和 Java 堆一样, 是各个线程共享的内存区域, 主要存储已被虚拟机加载的类信息, 常量, 静态变量, 即时编译器编译后的代码等数据. 这个区域的内存回收目标主要是针对常量池的回收和对类型的写在, 较少发生垃圾收集行为.
上面对 Java 虚拟机结构进行了非常精简的讲解, 大家可还对此清晰了一些? 如果还是没有太透彻其实没有关系, 多回顾几遍, 最好能自己画一个图, 在一边进行理解. 明天我们再来讲一讲我们另外一个面试非常高频的考点: 垃圾回收算法, 一起来探究 Java 虚拟机到底是怎么来回收一个无用的对象的.
来源: https://www.cnblogs.com/liushilin/p/11014168.html