备战BAT面试:查漏补缺——JVM内存模型

备战BAT面试的学习记录,整理了最近自己查漏补缺的知识点,总结出来和大家分享,如有错误,欢迎指出!

备战BAT面试


备战BAT面试:查漏补缺——JVM内存模型_第1张图片

JVM的内存分布如上图所示。方法区和堆是线程共享的,而寄存器、java方法栈、本地方法栈是各个线程私有的。


区域介绍

方法区

注:在最新的《深入理解Java虚拟机》一书中,已经取消了方法区“永久代”的称呼。

方法区是用来存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据这个区域很少进行垃圾回收,回收目标主要是针对常量池的回收和对类型的卸载。

运行时常量池

是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。

是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。

PC寄存器

是最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。

虚拟机栈(JVM Stack)

描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个"栈帧",用于存储局部变量表(包括参数)、操作栈、方法出口等信息。每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。声明周期与线程相同,是线程私有的。

  • 栈帧由三部分组成:局部变量区、操作数栈、帧数据区。
本地方法栈(Native Stack)

本地方法栈保存本地方法信息。Java程序的运行需要用到计算机本地的一些方法,这些方法大多都不是用Java语言编写的。本地方法栈就是为了调用这些计算机底层的方法而存在。

你可能感兴趣的:(备战BAT面试)