面试题集

【面试题集】JAVA内存模型详解

2019-11-22  本文已影响0人  逍遥天扬

在网上搜索JAVA内存模型。会发现网上全是将java的并发内存模型。本篇不承诺是原创,我是大自然的搜集工。

实际上,Java中应为不同的目的可以将java划分为两种内存模型:gc内存模型。并发内存模型。

品茗IT-面试题集-首发

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

gc内存模型

java在执行java程序的过程中会把它管理的内存划分若干个不同功能的数据管理区域,如图所示:

在这里插入图片描述
  1. 程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。
  2. Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用。
  3. 本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。
  4. Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。
  5. 方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。
  6. 运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。

几乎所有的对象/数组的内存空间都在堆上(有少部分在栈上)。在gc管理中,将虚拟机堆分为永久代、老年代、新生代。通过名字我们可以知道一个对象新建一般在新生代。经过几轮的gc。还存活的对象会被移到老年代。永久代用来保存类信息、代码段等几乎不会变的数据。堆中的所有数据是线程共享的。

并发内存模型

Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

image.png

java虚拟机中主内存和工作内存交互,就是一个变量如何从主内存传输到工作内存中,如何把修改后的变量从工作内存同步回主内存:

Java内存模型还规定了执行上述8种基本操作时必须满足如下规则:

面试中一般会问gc内存模型,而并发内存模型太高端了,与我们jvm调优无关。

JVM调优需要了解gc的内存模型,能够看的懂jstack等堆栈分析工具的分析结果。并针对性设置java允许参数。

上一篇 下一篇

猜你喜欢

热点阅读