JVM是什么?
JVM(Java Virtual Machine的简称。意为Java虚拟机。):指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 JVM的初心是为了跨平台 一次开发到处运行,其作用类似于一个翻译官。JVM能够屏蔽系统的差异,如果一种新发明出来的语言想跨平台,就可以直接借助JVM来完成,而无需自己考量。
现在看来JVM存在的意义已经不仅仅是为了跨平台, 而是提供了一个生态圈 。
jvm中的内存区域划分(面试考点)
1.JVM中的内存从哪来?
来自于操作系统。JVM 启动后会从操作系统申请一大块内存 再针对这个内存划分一些区域 不同区域分别用来做不同的事情。
JVM在运行程序时会把其自动管理的内存划分为以下几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共用的堆和方法区,粉色部分代表的是每个线程的自己的虚拟机栈,本地方法区和程序计数器。一个java进程中可能包含多个线程 多个线程之间公用一份堆和方法区,但是每个线程都有自己的栈和程序计数器。
-
堆(Heap)
堆是所有线程公用的一块内存区域,这块内存用来存放对象的实例,几乎所有的对象实例都在这里分配内存。 -
方法区(Method Area)
它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编 译器编译后的代码等数据
Java 虚拟机规范规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。 -
运行时常量池(Runtime Constant Pool)
运行时常量池是方法区的一部分,存放字面量与符号引用。
字面量 : 字符串(JDK1.7后移动到堆中) 、final常量、基本数据类型的值。
符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符 -
虚拟机栈(Java Virtual Machine Stacks)
它的生命周期与线程相同,随线程启动而生,随线程消亡而灭
存的是一个地址描述当前线程接下来要执行的指令在内存的哪个地方。每个方法执行的同时都会创建一个栈帧用于存储局部变量表、操作数 栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈和出栈 的过程。
1.如果线程请求的栈深度大于虚拟机所允许的深度(-Xss设置栈容量),将会抛出StackOverFlowError异常。
2.虚拟机在动态扩展时无法申请到足够的内存,会抛出OOM(OutOfMemoryError)异常 -
本地方法栈(Native Method Stacks)
本地方法栈为虚拟机使用的Native方法服务,而虚拟机栈 为JVM执行的Java方法服务。 -
程序计数器(Program Counter Register)
是一小块内存空间,主要代表当前线程所执行的字节码行号指示器。通过改变这个计数器的值来选取下一行需要执行的字节码指令。如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行 的是一个Native方法,这个计数器值为空。