JVM--运行时数据区域
Posted blogofjzq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM--运行时数据区域相关的知识,希望对你有一定的参考价值。
1.程序计数器
因为java的多线程时通过线程的轮流切换完成的,在任何一个时刻,一个处理器都只执行一个线程,为了线程执行后能恢复到正确的执行位置,每条线程都需要一个东西来记录执行到哪里了,这个东西就是程序计数器,每条线程都有一个程序计数器。程序计数器是唯一一个没有规定任何OutOfMemoryError的区域。
2.java虚拟机栈
它和程序计数器一样都是线程私有的。
每个方法执行的时候,创建一个栈帧,用来储存:局部变量表,操作数栈,动态链接,方法出口等。每个方法从执行到执行完毕都对应着入栈和出栈。
其中局部变量表存放各种基本数据类型和对象引用,在编译时就分配好了空间大小,运行时不可变
规定了两种异常
(1)StackOverflowError:线程请求的栈深度超过允许的深度 比如无限递归
(2)OutOfMemoryError:动态拓展时无法申请到足够的内存空间
3.本地方法栈
和虚拟机栈相似,甚至有的虚拟机把本地方法栈和虚拟机栈合二为一。区别在虚拟机栈执行java方法,本地方法栈执行native方法,对语言不做规定,也会抛出虚拟机栈的两种异常
4.java堆
大多数情况下是虚拟机管理的最大的一块内存,不一定在连续的内存空间中,逻辑上连续就行
存放对象实例的地方,也是垃圾收集管理的主要地方,具体信息后面和垃圾回收一起介绍
规定了OutOfMemoryError异常,是线程共享的区域
5.方法区
同java堆,方法区也是线程共享的区域,用来存放已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等信息
不同的虚拟机对方法区有不同的概念实现,如HotSpot用永久代来实现方法区,而其他虚拟机不存在永久代的概念,在JDK1.7中Hotspot将字符串常量池从方法区中移出。移到了堆中。
这个区域的回收比较困难,但又十分必要。
也规定了OutOfMemoryError异常。
6.运行时常量池
方法区的一部分,Class文件中除了有类的版本字段等等方法外,还有一个常量池,用来存放编译器生成的各种字面量和符号引用,在类被加载后,这部分内容放进运行时常量池。
具有动态性,在运行过程中也能放东西进去,如String的intern()方法就运用了这种特性。
也规定了OutOfMemoryError异常。
7.直接内存
不是虚拟机的一部分,属于堆外内存,但是会被频繁用到,在分配内存时要考虑到直接内存,不然容易使得各个内存区域和大于实际物理限制
以上是关于JVM--运行时数据区域的主要内容,如果未能解决你的问题,请参考以下文章