每日一问:你了解 Java 虚拟机结构么?

对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码。而对于我们 Android 乃至 Java 程序员,却总是会因为虚拟机的自动内存管理机制而忽视内存管理的重要性。

经过前面简短的几篇纯 Android 问题,我想再给大家掺杂一点可能平时你并没有太多关注的东西。其实写这个的时候我相当纠结,因为对于大多数 Android 开发来说,他们会更加注重实质性的技能提升,而不是我今天将要讲的 Java 虚拟机结构。

但经过一系列的思想斗争,我还是打算把这个讲到底,为了不浪费大家太多的时间,我依然遵从「每日一问」系列的初衷,我们尽可能地精简文字,让每一个小知识点阅读时间都控制在 5 分钟以下。

Java 虚拟机结构作为一个面试高频考点,你完全可以当做你在复习面试知识,这样兴许你的学习的心态会好一些。

每日一问:你了解 Java 虚拟机结构么?

我还是不得不去网上摘下了这个图,我想唯有用这张图结合讲解起来才更加的通俗易懂。

Java 虚拟机内存区域确实就由这几部分构成:方法区、虚拟机栈、本地方法栈、堆、程序计数器。

程序计数器

程序计数器是一个较小的内存空间,线程私有, 它是唯一一个在 Java 虚拟机规范中没有规定任何 OOM 情况的区域。

虚拟机栈

虚拟机栈和程序计数器一样,同样为线程所私有,并且生命周期和线程相同。。每个栈中的数据都是私有的,其他栈不允许访问,每个方法被执行的时候都会同时创建一个栈帧,每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈从入栈到出栈的过程。 虚拟机栈主要存放各种编译期可知的基本数据类型和对象的引用。

本地方法栈

本地方法栈与虚拟机栈发挥的作用非常相似,其主要区别是 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地房发展则是为虚拟机用到的 Native 方法服务。

Java 堆

Java 堆是垃圾收集器管理的主要区域,主要用于存放对象的实例,自然而然就成了 Java 虚拟机中管理内存最大的一块,并且它可以处于物理上不连续的内存空间中,Java 堆在虚拟机启动的时候就进行创建,并被所有线程所共享。

方法区

方法区和 Java 堆一样,是各个线程共享的内存区域,主要存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的回收和对类型的写在,较少发生垃圾收集行为。

上面对 Java 虚拟机结构进行了非常精简的讲解,大家可还对此清晰了一些?如果还是没有太透彻其实没有关系,多回顾几遍,最好能自己画一个图,在一边进行理解。明天我们再来讲一讲我们另外一个面试非常高频的考点:垃圾回收算法,一起来探究 Java 虚拟机到底是怎么来回收一个无用的对象的。

Original: https://www.cnblogs.com/liushilin/p/11014168.html
Author: 南尘
Title: 每日一问:你了解 Java 虚拟机结构么?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539310/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java http/https post/get 请求 ,携带header参数

    java;gutter:true; import com.alibaba.fastjson.JSONObject;</p> <p>import org.ap…

    Java 2023年5月29日
    066
  • java面试题(2022最新)

    JDK 和 JRE 有什么区别?JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。…

    Java 2023年6月6日
    057
  • golang学习链接

    GitHub入门: https://github.com/rubyhan1314/Golang-100-Days Golang中国: https://www.qfgolang.co…

    Java 2023年6月6日
    077
  • maven基础入门

    maven翻译为”专家”,”内行”。Maven是Apache下的一个纯java开发的开源项目,它是一个项目管理工具,使用maven对…

    Java 2023年6月9日
    065
  • JAVA基础-接口和抽象类

    个人经验,抽象类工作中很少见。 不过鉴于一直对这些概念很模糊,所以学习记录一下。 一、什么是抽象类? 简单来说,不管是抽象类还是抽象方法都必须用 abstract 关键字进行 声明…

    Java 2023年6月5日
    076
  • 使用metaWebBlog接口实现博客文章同步

    想实现自己的文章一处编写,多处发布到各大平台(比如博客园,CSDN)等要怎么实现呢。需要由这些组成: 一般来说,写文章的软件很容易获得,如果目标平台再有开放接口,我们可以将文章通过…

    Java 2023年5月30日
    044
  • Java学习 (22) 对象篇(02)类与对象

    类与对象的关系 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物. 动物(猫、狗)、植物(花、草)、手机(安卓、苹果)、电脑(联想、华硕)、&…

    Java 2023年6月8日
    092
  • 【LEETCODE】74、第542.题 01 矩阵

    package array.medium; import java.util.ArrayDeque; import java.util.Deque; import java.uti…

    Java 2023年6月5日
    050
  • java高并发,如何解决,什么方式解决

    案例一: 订票系统案例,某航班只有一张机票,假定有1w个人打开你的网站来订票,问你如何解决并发问题(可扩展到任何高并发网站要考虑 的并发读写问题) 问题,1w个人来访问,票没出去前…

    Java 2023年5月29日
    052
  • Java bean与xml 互转(对象转xml、xml转对象)

    日常吐槽: 好久都没怎么分享自已了…… ╮(╯▽╰)╭,最近有个需求,需要把 bean对象 转成 xml 文件,然后 xml 文件 转成对象 ( 生成 与 …

    Java 2023年5月29日
    093
  • 迷途的野指针,都快找不着北了

    指针,C语言开发者表示很淦,指针的使用,很多人表示不敢直面ta,不像Java一样,有垃圾自动回收功能,我们不用担心那么多内存泄漏等问题,那C语言里边呢,指针又分为了”野…

    Java 2023年6月5日
    077
  • 2020年度钻石C++C学习笔记(3)–《博学谷》

    1.Unix/Linux操作系统介绍 1.1 操作系统的作用 1.1.1 操作系统的目标 l 方便:使计算机系统易于使用 l 有效:以更有效的方式使用计算机系统资源 l 扩展:方便…

    Java 2023年6月7日
    076
  • JavaFX Metro UI 和 开发库

    这是一个Windows设计风格的UI库,使用非常简单,只要一行代码就可以实现整体UI风格的替换! <span class="hljs-selector-tag&qu…

    Java 2023年6月9日
    060
  • 项目版本管理Git使用详细教程

    前言 记得刚开始做项目开发的时候都是一个人完成一个项目,单打独斗的开发,也不知道什么是团队开发,没有这个概念,随着工作后来知道公司里项目都是团队开发,这个时候这么多人怎么开发一个项…

    Java 2023年6月13日
    087
  • 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..

    1、类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个 java.lang.Class对象用来…

    Java 2023年5月29日
    087
  • ActiveMQ修改密码

    首先修改网页登录密码 1: 打开安装目录,进入conf目录,找到jetty.xml https://www.sunjs.com/article/detail/e15c588dd62…

    Java 2023年5月29日
    062
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球