[TOC]
[图片上传失败...(image-b8ff6a-1513865396951)]
虚拟机栈
[图片上传失败...(image-4b9815-1513865396951)]
- 每个线程有一个==私有==的栈,随着线程的创建而创建
- 每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息
- 栈的大小可以固定也可以动态扩展
- 以栈帧为单位,进行压栈和出栈
本地方法栈
这部分主要与虚拟机用到的 Native 方法相关,一般情况下, 不需要关心这部分的内容
PC 寄存器
也叫程序计数器
- JVM支持多个线程同时运行,每个线程都有自己的程序计数器
- 倘若当前执行的是 JVM 的方法,则该寄存器中保存当前执行指令的地址;倘若执行的是native 方法,则PC寄存器中为空
- ==线程私有==,因为多线程并发回来后要恢复到当前线程之前执行的位置,所以每个线程都会独立拥有一个 PC
- 占用空间极小
堆
- 堆内存是 JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建
- 所有的对象和数组都在堆上进行分配
- 这部分空间可通过 GC 进行回收。当申请不到空间时会抛出 OutOfMemoryError
方法区(Method Area)
特点
- ==线程共享==
- 又称为 Non-Heap,用来和堆进行区分
- 用于存储已被虚拟机加载的==类信息==、==常量==、==静态变量==、即使编译后的代码等数据
- HotSpot 虚拟机把 GC 分代收集扩展至方法区,所以在 HotSpot 可以称它为永久代(Permanent Generation)
方法区的大小的分配
- -XX:MaxPermSize 最大值,上线
- -XX:PermSize 最小值
-XX:MaxPermSize=10M -XX:PermSize=10M
运行时常量池(Runtime Constant Pool)
用于存放编译期生成的各种字面量和符号引用
直接内存
直接内存并不是虚拟机运行时数据区的一部分。
在NIO中,引入了一种基于通道和缓冲区的I/O方式,它可以使用native函数直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。
-XX:MaxDirectMemorySize设置最大值,默认与java堆最大值一样。
-XX:MaxDirectMemorySize=10M -Xmx20M
网友评论