您的位置:首页 > 编程语言 > Java开发

Java虚拟机第二章2.2 学习笔记

2017-11-07 17:27 211 查看
Java运行时数据区

1、程序计数器:是一小块内存空间,是当前线程所执行的字节码的行号指示器(每个线程都有一个)。因为Java多线程中,线程轮流切换并分配处理器执行时间,实际上一个处理器在一个时间点只能执行一条指令。所以当线程切换时,为了使程序能继续恢复到正确的执行位置,就需要程序计数器告诉我们当前程序执行到哪里了。

2、Java虚拟机栈

是Java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成都伴随着一个栈帧在虚拟机栈中入栈到出栈的过程。

局部变量表:存放了编译期可知的各种基本数据类型(8种)、对象引用和returnAddress(一条字节码指令的地址),该表在编译期已经确定了大小,方法运行期不会改变局部变量表的大小。

如果线程请求的栈深度大于虚拟机上限,则StackOverFlow异常, 如果请求栈无法申请到足够内存,则报OutOfMemoryError。

3、本地方法栈

和虚拟机栈作用类似,虚拟机栈为执行的Java方法服务, 本地方法栈为虚拟机使用到的native方法服务。

4、Java堆

是所有线程共享的一块区域,唯一目的是存储对象实例。几乎所有对象实例都在此分配内存。粗略包括新生代、老年代,细分为:Eden、From Survivor,To Survivor。可在物理上处于不连续的空间中,可扩展。

5、方法区

各个线程共享的内存区域。用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

-XX:PermSize、-XX:MaxPermSize

分配用来设置方法区的最小大小和最大大小。Java 8以后移除了方法区,取而代之的是本地元空间Metaspace,大小由-XX:MetaspaceSize和-XX:MaxMetaspaceSize调节。

5.1运行时常量池

是方法区的一部分。class文件中除了类版本、字段,方法,接口等描述信息外,还有这个‘常量池’,存储编译期生成的‘字面量’和‘符号引用’,这两个东西将在类加载后存储在‘常量池’中。一般‘直接引用’也会存储于‘常量池’中。

6、直接内存

使用native函数库分配堆外内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: