Java面试题十二:Java内存模型,h5移动端开发面试题

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

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

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

什么是JVM内存

============

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

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

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

Java面试题十二:Java内存模型,h5移动端开发面试题

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

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

Java面试题十二:Java内存模型,h5移动端开发面试题

  • 程序计数器(PC Register)

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

  • 虚拟机栈(JVM Stack)

也就是我们常常所说的栈。

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

Java面试题十二:Java内存模型,h5移动端开发面试题

  • 本地方法栈(Native Method Stack)

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

  • Java堆(Heap)

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

  • 方法区(Method Area)

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

  • 常量池(Runtime ConJava面试题十二:Java内存模型,h5移动端开发面试题
    stant Pool)

存放编译器生成的各种字面量和符号引用,是方法区的一部分。

Java内存模型

============

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

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

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

上一篇:使用Adblock Plus屏蔽百度网页推荐上的广告


下一篇:wordpress如何修改默认标题样式