前言

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内存模型即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的项目框架和技术管理上。但美团一面的面试官视乎是比较重基础知识,而且每个点都问得比较仔细。

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

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

“标准答案”

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

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

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

Java面试题十二:Java内存模型相关推荐

  1. java面试题总结(二)----java中级面试题 含答案

    一.Java基础 1. 实例方法和静态方法有什么不一样? 2. Java中的异常有哪几类?分别怎么使用? 检出异常,非检出异常.检出异常需要try...catch才能编译通过.非检出异常不用try.. ...

  2. java面试题十二 String返回类型

  3. Java学习系列(十二)Java面向对象之序列化机制及版本

    序列化:内存中的Java对象<-->二进制流 目的:a)有时候需要把对象存储到外部存储器中持久化保存,b)还有时候,需要把对象通过网络传输. 可序列化的对象,Java要求可序列化的类实现下 ...

  4. Java 读书笔记 (十二) Java Character 类

    在实际开发过程中, 我们经常会遇到需要使用对象,而不是内置数据类型的情况. 为了解决这个问题, Java语言为内置数据类型char提供了包装类Character类. 可以使用Character的构造方 ...

  5. 面试题汇总二 Java 多线程篇

    前言 题目汇总来源 史上最全各类面试题汇总,没有之一,不接受反驳 面试题汇总一 Java 语言基础篇 面试题汇总二 Java 多线程篇 面试题汇总三 Java 集合篇 面试题汇总四 JVM 篇 面试题 ...

  6. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  7. JVM进阶(十二)——JAVA 可视化分析工具

    JVM进阶(十二)--JAVA 可视化分析工具   经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工具来实践一番. ...

  8. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  9. Java面试题(十四)----- 如何获取父类的类名字 ? 如何获取当前运行类的类名

    Java面试题(十四)----- 如何获取父类的类名字 ? 如何获取当前运行类的类名 文章目录

最新文章

  1. 浅谈Linux下的EXT3文件系统
  2. Eclipse中Spring插件:Spring Tool 4(aka Spring Tool Suite 4)插件安装
  3. 11月11日:一个人的情人节
  4. python自动化办公 51cto_利用python实现批量自动化运维脚本案例
  5. getAttribute实例例java,Java AttributedCharacterIterator.getAttribute方法代码示例
  6. 系统管理员不可不知的三条黄金法则
  7. 通过朋友间推广APP,根本不可行
  8. c++ascii表_几道和散列(哈希)表有关的面试题
  9. Win10校园网锐捷客户端犯病 可能有用的2个措施
  10. 双网卡,上网走外网网卡,内网走内网网卡设置。
  11. 163的邮箱怎么注册?163的邮箱格式怎么填写?
  12. 有没有不用加班的程序员?如何衡量程序员的工作量?
  13. CSPS2019Day2T1(Emiya家今天的饭)题解
  14. 使用Selenium从IEEE与谷歌学术批量爬取BibTex文献引用
  15. layui制作二维码
  16. CodeForces - Feng Shui(半平面交)
  17. 排查maven中可以从远程下载下来jar包,但是却报错Failure to find was cached in the local repository, resolution will not
  18. SQL中的 update用法+示例
  19. 狼书三卷终大成,狼叔亲传Node神功【留言送书】
  20. 宏基aspire拆机触摸_Acer 4530笔记本怎么拆机? 宏基Acer Aspire 4530拆机教程

热门文章

  1. 常见的JavaScript调试工具
  2. 三星的折叠屏手机问世,会带动整个产业发展吗?
  3. HTML最新标准HTML5小结
  4. 浏览器指纹追踪技术,如何完整修改浏览器指纹?
  5. vue+echarts实现数据展示大屏
  6. 数组的常用方法详解一
  7. Python删除酷狗多余音乐文件
  8. 网络基础知道——路由器篇
  9. IBM本本常识,答记者问
  10. Linux命令之删除空目录rmdir