1.什么是jvm
jvm是Java Virtual Machine的首字母缩写,字面意思理解就是java虚拟机,它的主要作用就是将java程序用javac.exe(编译器)翻编译成字节码文件,再由解释器翻译成机器可执行的机器码进行运行.
java的跨平台特性就是基于jvm来实现的,不同的操作系统有对应的jvm,
2.jvm组成
jvm = 类加载子系统+ 执行引擎+运行时数据区
类加载子系统: 可以根据指定的全限定名来载入类或接口
执行引擎: 负责执行哪些包含在被载入类的方法中的指令.
运行时数据区: 方法区(method area) + 堆(heap) + java栈(vm stack) + 本地方法栈(native method stack) +程序计数器

3.运行时数据区
1.程序计数器: 线程私有 ,不会产生oom
程序计数器是一块较小的内存空间,可以把他看成是当前线程所执行的指令的行号指示器,在java虚拟机的概念模型里,字节码解释器的工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令.分支,循环,跳转,异常处理,线程恢复等基础功能都要一来这个计数器来完成.
2.虚拟机栈 线程私有 会产生oom sof(stackoverflowError)栈溢出
由于此区域是线程私有的,所以它的生命周期与线程相同,虚拟机栈描述的是java方法执行的线程内存模型,每个方法被执行的时候,java虚拟机都会同步创建一个栈帧用于存储局部变量,操作数栈,动态链接,方法出口等信息.每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程.
在java虚拟机规范中,对这个内存区域规定了两类异常状况:
OOM OutOfMemoryError 内存溢出: 内存不够用会抛出这个异常 比如 在方法中定义一个集合,然后无限向循环中加入对象.
SOF StackOverflowError 栈溢出 : 当前线程请求的栈的深度大于虚拟机允许的最大深度,方法的调用实际上就是一个入栈出栈的过程 递归调用一个方法,如果没有出口,则会抛出这个异常.
3.本地方法栈 线程私有 会产生oom sof(stackoverflowError)栈溢出
本地方法栈与虚拟机栈发挥的作用是非常相似的,其区别在于虚拟机栈为java虚拟机执行java方法服务,本地方法栈为虚拟机使用到的本地方法服务
与虚拟机栈一样,本地方法栈也会存在抛出栈溢出与内存溢出的可能性.
4.堆 线程共享 会产生oom
堆是虚拟机锁管理的内存中最大的一块,此区域被所有线程共享,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象的实例, java世界里 几乎所有的对象实例都在这里分配内存,垃圾回收器管理的重点区域,因此也被称为GC堆
5.方法区.线程共享 会产生oom
方法去与堆一样,是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码缓存等数据.虽然java虚拟机规范中将方法区描述为堆的一个逻辑部分,但它有一个别名叫非堆,目的是与堆区分开来.
运行时常量池是方法区的一个部分,Class文件中除了有类的版本,字段,方法,接口描述等信息以外,还有一项信息是常量池表,用于存放编译期生成的各种字面量与符号引用.
此区域与堆一样,内存不足的情况下也会抛出内存溢出OOM
本文详细介绍了Java虚拟机(JVM)的基本概念,包括其主要作用,如何实现Java的跨平台特性,以及JVM的组成部分。JVM由类加载子系统、执行引擎和运行时数据区构成。运行时数据区包括程序计数器、虚拟机栈、本地方法栈、堆和方法区,这些区域各自承担不同的功能,并可能产生内存溢出(OOM)或栈溢出(SOF)异常。文章还深入探讨了每个区域的特性和工作原理,对于理解Java程序的执行过程非常有帮助。
1861

被折叠的 条评论
为什么被折叠?



