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