Java虚拟机的内存结构通常能够从线程共有和线程私有两部分起头提及,而后再详细说明各自的部分,相似树状结构的做答,好处就是思路清晰,面试官听着也舒服。java
线程共有的包括Java堆和方法区,线程私有的包括虚拟机栈、本地方法栈和程序计数器。这些内容回答一遍后,就能够开始详细叙述每一个点的详细部分。面试
Java堆是用于存放Java程序运行时所需的对象等数据,Java堆又分为新生代和老年代。咱们日常所说的垃圾回收,主要回收的就是堆区。更细一点划分新生代又可划分为Eden区和2个Survivor区(From Survivor和To Survivor)。函数
方法区中最为重要的是类的类型信息、常量池、域信息、方法信息。总之,方法区保存的信息,大部分来自于 class 文件,是 Java 应用程序运行必不可少的重要数据。spa
程序计数器用于存放下一条运行的指令,这里是惟一无内存溢出的区域。若是当前程序正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,若是当前线程正在执行一个Native方法,则程序计数器为空。线程
虚拟机栈和本地方法栈用于存放函数调用堆栈信息。虚拟机执行java程序的时候,每一个方法都会建立一个栈帧,栈帧存放在java虚拟机栈中,经过压栈出栈的方式进行方法调用。对象
不少人分不清虚拟机栈和本地方法栈的区别,由于本地方法栈(Native Method Stacks)与虚拟机栈所发挥的做用是很是类似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。内存