jvm(运行时数据区域)
Posted muyarn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm(运行时数据区域)相关的知识,希望对你有一定的参考价值。
以上是jvm在运行时内存的数据分区图例(各个分区简介):
1、程序计数器:
在jvm中一块很小的区域,主要作用就是记录当前线程执行字节码的行号指示器。
在单核的多线程中,cpu会在不同线程之间切换,为了切换回来时正确的回到当前线程的执行位置,
每个线程都有自己单独的程序计数器,之间互不影响,独立运行,同时这块区域也是在java虚拟机
规范中唯一没有规定任何OutOfMemoryError情况的区域。
2、虚拟机栈:
java虚拟机栈和程序计数器一样,都是线程私有的,他的生命周期和线程一样,它描述的是Java方法内存模型,
每个方法的执行的同时都会创建一个栈帧,用于存储局部变量,操作数栈等。
这块区域定义了两个异常:
1、如果线程的请求栈深度大于虚拟机栈所允许的最大深度,会抛出 StackOverflowError异常
2、如果虚拟机栈可以动态拓展的话,如果拓展时无法申请到足够的内存,就会抛出 OutOfMemoryError异常
3、本地方法栈
和虚拟机栈类似,为虚拟机使用到的native方法服务,抛出的异常和虚拟机栈一样
4、堆内存
对于大多数的应用来说,Java堆是java虚拟机管理中内存最大的一块,是被所有线程共享的一块区域,虚拟机启动时创建,
此区域的唯一目的是存放对象的实例,几乎所有的对象的实例都在这里分配内存,当堆内存中无法拓展内存,或者当前内存
的堆内存无法给新的对象分配内存,此时会抛出OutOfMemoryError
5、方法区
和堆类似,被各个线程共享,主要存储虚拟机加载的类信息,静态变量,常量
运行时常量池也是方法区的一部分,也会抛出OutOfMemoryError异常
6、直接内存
jdk 1.4之后,新增nio,一种基于通道和buffer 方式,通过调用native函数库调用堆以外的内存,通过directByteBuffer对象
进行操作,避免Java堆 和native堆之间来回复制数据,这块内存受本机总内存的影响,也会抛出OutOfMemoryError
以上是关于jvm(运行时数据区域)的主要内容,如果未能解决你的问题,请参考以下文章