jvm是java面试高级工程师,月薪翻过15k,永远绕不开的坎,我就是深受其害,故工作稳定下来后,开始深入学习研究下jvm,实现一劳永逸,以后每次面试前翻出来瞟一眼,顺利通过jvm面试题。
java编程之所以当前比较流行,主要有两方面原因,一是java在jvm上运行,能实现跨平台,一处编译,处处运行;另外一个是,java有自动回收垃圾的机制,可以将程序员从手动回收垃圾的烦恼中解脱出来。这两点都和jvm相关,故可以看出来,jvm为何是高级程序员必备。
1、 jvm运行时数据分区为:(1)、线程共享数据区:java虚拟机栈、本地方法栈、程序计数器。
(2)、线程隔离数据区:堆、方法区。
内存模型图如下:
2、线程隔离区:
(1)、程序计数器:
i、定义:当前线程所执行的字节码的行号指示器。
ii、特点:
①内存空间较小,内存区域中唯一不存在OM(OutOfMemoryError)的区域。
②字节码解释器工作时,通过改变计数器的值来选取下一条要执行的字节码指令、分支、循环、跳转、异常处理、线 程恢复等基础功能都需要毅力陈旭计数器。
③线程私有内存。为了线程切换后能恢复到真去的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之 间计数器互不影响,独立存储,
(2)、Java虚拟机栈:
i、定义:作用于方法执行的一块java内存区域。
ii、特点:
①每个方法在执行的同时都会创建一个栈帧(Stack Framel),用于存储局部变量表、操作数栈、动态链接、方法出 口等信息。每个方法从调用直至执行完成,就对应着一个栈帧在虚拟机中入栈和出栈的过程。
②局部变量表存放了编译期可知的8种基本数据类型(boolean、char、byte、int、short、long、double、float)及对 象的引用(reference类型)。
③如果线程请求深度大一虚拟机所允许的深度,将抛出StackOverFlow异常。
(3)、本地方法栈:
i、定义:作用于本地方法执行的一块内存区域。
ii、特点:
①与java虚拟机栈相同,每个方法在执行的同时都会创建一个栈帧(Stack Framel),用于存储局部变量表、操作数 栈、动态链接、方法出 口等信息。每个方法从调用直至执行完成,就对应着一个栈帧在虚拟机中入栈和出栈的过程。
②IBM的Hotshot将虚拟机栈和本地方法栈合二为一。
③主要用于调用非java语言(例如调用cpu的指令接口),提供类似于接口的功能。
3、线程共享区:
(1)、堆:
i、定义:Java中存放内存实例对象实例的区域,几乎所有的对象实例都是在这里获取内存。
ii、特点:
①java虚拟机所管理的内存中最大的一块。
②垃圾收集器管理的主要区域。
③最大堆内存调整 -Xmx,最小堆内存调整 -Xms.
④分为新生代和老年代,新生代又分为To Space、From Space、Eden。
(2)、方法区:
i、定义:用于存储被虚拟机加载的类信息、常量、静态变量、即时编译的代码等数据。
ii、特点:
①该区域的垃圾回收,主要是对常量池的回收和类的卸载。
②Hotspot使用永久代来实现方法区。例如Jrockit、IBM。