JVM(1)--运行时数据区域

1.程序计数器

因为java的多线程时通过线程的轮流切换完成的,在任何一个时刻,一个处理器都只执行一个线程,为了线程执行后能恢复到正确的执行位置,每条线程都需要一个东西来记录执行到哪里了,这个东西就是程序计数器,每条线程都有一个程序计数器。程序计数器是唯一一个没有规定任何OutOfMemoryError的区域。

2.java虚拟机栈

它和程序计数器一样都是线程私有的。

每个方法执行的时候,创建一个栈帧,用来储存:局部变量表,操作数栈,动态链接,方法出口等。每个方法从执行到执行完毕都对应着入栈和出栈。

其中局部变量表存放各种基本数据类型和对象引用,在编译时就分配好了空间大小,运行时不可变

规定了两种异常

(1)StackOverflowError:线程请求的栈深度超过允许的深度 比如无限递归 

(2)OutOfMemoryError:动态拓展时无法申请到足够的内存空间

扫描二维码关注公众号,回复: 1931911 查看本文章

3.本地方法栈

和虚拟机栈相似,甚至有的虚拟机把本地方法栈和虚拟机栈合二为一。区别在虚拟机栈执行java方法,本地方法栈执行native方法,对语言不做规定,也会抛出虚拟机栈的两种异常

4.java堆

大多数情况下是虚拟机管理的最大的一块内存,不一定在连续的内存空间中,逻辑上连续就行

存放对象实例的地方,也是垃圾收集管理的主要地方,具体信息后面和垃圾回收一起介绍

规定了OutOfMemoryError异常,是线程共享的区域

5.方法区

同java堆,方法区也是线程共享的区域,用来存放已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等信息

不同的虚拟机对方法区有不同的概念实现,如HotSpot用永久代来实现方法区,而其他虚拟机不存在永久代的概念,在JDK1.7中Hotspot将字符串常量池从方法区中移出。移到了堆中。

这个区域的回收比较困难,但又十分必要。

也规定了OutOfMemoryError异常。

6.运行时常量池

方法区的一部分,Class文件中除了有类的版本字段等等方法外,还有一个常量池,用来存放编译器生成的各种字面量和符号引用,在类被加载后,这部分内容放进运行时常量池。

具有动态性,在运行过程中也能放东西进去,如String的intern()方法就运用了这种特性。

也规定了OutOfMemoryError异常。

7.直接内存

不是虚拟机的一部分,属于堆外内存,但是会被频繁用到,在分配内存时要考虑到直接内存,不然容易使得各个内存区域和大于实际物理限制

猜你喜欢

转载自www.cnblogs.com/blogofjzq/p/9277551.html