前言
随着阿巴阿巴在面试中愈战愈勇,这几天又约上面试了,这次面试官让她谈谈对JVM的理解。
回家等通知
面试官: 你对JVM的内存模型了解吗?能否讲讲里面的细节呢?
阿巴阿巴: JAVA虚拟机在执行JAVA程序的过程中,会把所有它管理的内存划分为若干个不同的数据区域,这些区域都有着各自的用途。
根据《JAVA 虚拟机规范SE 7 版》的规定,JAVA虚拟机所管理的内存将包括以下几个运行时的数据区域:堆、方法区、虚拟机栈、本地方法栈、程序计数器。
面试官: 那你能给我大概的介绍下这几区域吗?
阿巴阿巴: 方法区主要存放的是虚拟机加载的类信息、常量、静态变量,堆区域主要是存放对象的,虚拟机栈是用来存放方法运行时产生的栈帧的,本地方法栈则是用来存放本地方法(native)方法运行时产生的栈帧的,程序计数器是用于存放下一条指令所在单元的地址的地方。
面试官: 不错,那你知道什么时候栈内存会发生溢出嘛?
阿巴阿巴: 嗯,,,如果线程的栈深度大于虚拟机运行的最大深度,将抛出StackOverflowError异常,常常出现于递归的方法调用。
面试官: 那还有其他情况会出现栈内存溢出嘛?
阿巴阿巴: 好像没有其他情况了......
面试官: 堆的分代可以细讲一下嘛?
阿巴阿巴: 堆的话主要进行了一个分代,分成新生代、老年代、持久代。
阿巴阿巴: 新生代主要存一些朝生夕死的对象,老年代存的是比较稳定的对象或者是大对象,持久代用于存放用于存放静态文件,如今java类、方法等。
面试官: 好的、那今天的面试就到这里吧,你先回去等通知哈。