Java程序员面试的时候,谈谈虚拟机,显得高大上,显得水准高。本文只负责简单的讲解,通俗易懂,可以应对面试时的一些问题。当然遇到高手的时候,肯定会折了,所以要深入的学习原理的同学请绕道看书。
先谈虚拟机基本的体系结构:类加载器、运行时数据区、执行引擎。
- 类加载器ClassLoader:用来加载class文件到jvm,使用委托模式加载类,加载一个类时,先委托父加载器加载。
面试题:平常写代码不会用到ClassLoader,在什么情况下可能使用到呢?
例如算法竞赛的在线评测系统,允许用户上传Java代码,在后台动态编译成class字节码,此时就可以用到ClassLoader动态加载类。
- 运行时数据区:主要分成方法区、堆、Java栈、PC寄存器。
方法区:存放类加载器加载类的信息,即类定义信息。
堆:所有的对象都在堆上分布,所有的线程共享。Java堆的实现基于分代原理。hotspot将堆分成新生代、年老代。新生代分为伊甸园和两个幸存者区。新建对象时会首先分配在新生代的伊甸园,如果是大对象会直接分配在年老区。
Java栈:每个方法执行的时候都会有自己的Java栈,所以方法内的本地变量是线程安全的。
面试题:什么时候会引起堆溢出 HeapOverflow,什么时候会引起栈溢出 StackOverflow?
堆是用来分配对象的,只要新建对象需要的内存大于剩余的内存就会发生堆溢出。如死循环中不断的new对象,又比如直接申请一块超大的内存 byte[] bigMemory = new byte[1024 * MB]
栈溢出就是方法不断的执行,比如死循环,或者递归调用时没有正确的终止条件。
- 执行引擎:虚拟机的核心,执行行为由指令集来定义。
- 分类:Full GC 和 Minor GC 分别用来回收年老代和新生代。通常Full GC发生时会伴随着一次minor GC,而且时间上Full GC比minor GC更长,还会造成应用的暂停。
- 算法:垃圾回收常用算法有引用计数、标记清除、复制算法等。