面试的时候经常会问到与jvm有关的面试题。若答案有问题还请各位指正。
question:请你谈谈jvm?
answer:jvm即Java虚拟机,可以加载Java字节码,也是Java能够多平台运行的关键。
jvm在内存上面分为五个区:堆、栈、方法区、程序计数器、本地方法栈。
堆区主要是储存我们new出来的对象实例,内存是公有内存对所有线程可见;
栈区运行时产生的局部变量和方法调用,为私有内存即不是所有线程可见的;
方法区,储存已加载的类信息、常量、静态变量、方法代码,为公有内存为所有线程可见,因此方法区也叫非堆。
一个Java类完整的生命周期会经历五个阶段:加载、连接、初始化、使用、卸载。加载、连接、初始化三个阶段一起叫做类加载。
加载:当jvm预计会使用该类的时候,会给出类的路径,根据类的路径找到类的字节码文件。
连接:会做验证和准备。验证主要是验证这个类是否符合字节码的格式、变量方法等是否符合标准。准备是为静态变量分配初始内存。
初始化:初始化静态代码块、静态语句。
使用:
卸载:该类满足Java gc回收机制就会被回收不掉,在有向图中是不可达的和程序不会再使用这些对象将会被gc回收。其实就是方法区清空消息。