Android面试一天一题(Day 44:实战美团--Java内存模型)

我在7月底暂停了Android模拟面试(模拟面试:一天一面),有几个原因:

  1. 面试者的群体和我预估的不大一样,我的面试侧重点和套路需要改进;
  2. 有点乏了,需要休息一段时间(每天坚持在一个时间段出现也是个体力活);
  3. 需要反省和学习一下别的面试官的方式;

正好在这个时间段有一些知名公司要在成都建研发中心,我计划去面试几家。合适的话也是一个机会,如果恰巧能找到一个适合自己发挥的平台也是极好的。再说这段时间老面试别人,也该让自己也体验一下作为面试者的心态和感受了。

所以,这一篇的面试题和大家谈谈我上周面试美团被问到的Java基础题。

面试题:说说Java的内存模型

说实话,把我问的有点“蒙”,确实知道一二,但在工作中很少总结这个方面,以前也专门看过,但那又是太遥远的事情了。硬着头皮把一些想法和记忆说了出来。

有读者会纳闷了,这样的题都能“吓蒙”你?

面试官不一定是最好的面试者,就像教练不一定非要是世界冠军。

面试官的套路和我预想的不一样,没有关注项目经验、管理和架构设计,上来就Java基础到Androd基础,而且极其细致。

Java的内存模型

Java开发人员并不需要像C/C++开发人员,需要时刻注意内存的分配和释放,而是全权交给虚拟机(JVM)去管理,自然关于内存管理或是内存的模型、结构对Java开发来说就是一个“黑箱”。

两眼一抹黑似乎也不影响写Java的代码。但我也说过,了解一些内部的机制或者是自己认为不重要的东西,也许会很有帮助。

最简单的,我们也应该了解Java的堆和栈。而我们所谓的内存管理,基本上指对堆内存的管理,那堆内存在JVM的内存结构中的那个位置呢?

什么是JVM内存
Java源代码文件(.java)会被Java编译器编译为字节码文件(.class),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。

JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。

JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。

了解清楚JVM的内存结构会更有助于我们理解Java的内存模型。

我们可以把上图的“运行时数据区”分为线程私有和共享数据区两大类。其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含Java堆、方法区,在方法区内有一个常量池。

  • 程序计数器(PC Register)
    记录正在执行的虚拟机字节码的地址。和计算机组成原理中提到的程序计数器PC概念类似,是线程私有的,用来记录当前执行的字节码位置。

  • 虚拟机栈(JVM Stack)
    也就是我们常常所说的栈。
    方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧。虚拟机栈的生命周期与线程相同,每个方法(不包含native方法)执行的同时都会创建一个栈帧结构,方法执行过程,对应着虚拟机栈的入栈到出栈的过程。

  • 本地方法栈(Native Method Stack)
    本地方法栈则为虚拟机使用到的Native方法提供内存空间。

  • Java堆(Heap)
    Java堆一般是JVM管理的内存中最大的一块,堆在主内存中,是被所有线程共享的一块内存区域,其随着JVM的创建而创建,是用来存储对象本身的以及数组,同时JAVA堆也是GC管理的主要区域。

  • 方法区(Method Area)
    主要存放的是已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。

  • 常量池(Runtime Constant Pool)
    存放编译器生成的各种字面量和符号引用,是方法区的一部分。

内存模型

Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。Java线程之间的通信由JMM控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。

从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(上面提到的Java堆内存)中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。

在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。

Java内存模型与上面提到的JVM运行时数据区(JVM Runtime Data Areas)两个概念容易混淆。JVM 运行时数据区定义了JVM运行期内存的管理划分,而Java内存模型定义了程序中各个共享变量的访问规则。

自己的面试总结

关于Java的内存模型,我觉得对于Android应用开发比较有益的就是:更容易理解线程安全和并发编程的问题。而后面面试官确实也问到了线程安全,可能这也是一个组合套路吧。

面试完后,虽然有很多题答得都不是很理想,不过对于我这样的“过来人”来说,很清楚面试时你回答的内容并不是最重要的(大多数时候)。重要的是什么?看完这个系列的读者应该心里有数。

附上自己的面试总结:

  • Java部分准备不充分。
    在面试前我对这个职位的信息收集并不充分,我的侧重点在Android的项目框架和技术管理上。但美团一面的面试官视乎是比较重基础知识,而且每个点都问得比较仔细。

  • 没有问面试官的姓名。
    下来都不好和面试官做朋友,不是吗?万一以后是同事,还不知道对方是谁也有点尴尬。以前有过,和一个同事处了一段时间了,他才告诉我之前是他面的我。

  • 表达了一些负面信息。
    解释了一些不足的地方,个人一直不喜欢“强调”负面信息,在我的一些表达中,还是不自觉的先抑后扬了,不过好在面试官视乎不太在意。

“标准答案”

标准答案为何打引号,请关注Android面试一天一题(Day 43:设计模式)的说明。

面试题:Java的内存模型
标准答案:Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。程序中的变量存储在主内存中,每个线程拥有自己的工作内存并存放变量的拷贝,线程读写自己的工作内存,通过主内存进行变量的交互。JMM就是规定了工作内存和主内存之间变量访问的细节,通过保障原子性、有序性、可见性来实现线程的有效协同和数据的安全。

面试题:JVM如何判断一个对象实例是否应该被回收?
标准答案: 垃圾回收器会建立有向图的方式进行内存管理,通过GC Roots来往下遍历,当发现有对象处于不可达状态的时候,就会对其标记为不可达,以便于后续的GC回收。

面试题:说说JVM的垃圾回收策略。
标准答案: JVM采用分代垃圾回收。在JVM的内存空间中把堆空间分为年老代和年轻代。将大量创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象。


相关面试题:
Android面试一天一题(Day 37:一套高级工程师的面试题)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容