jvm 运行时数据区,包含
栈:(线程独有)
本地方法栈(Native Method Stack)
为了JVM 执行 native方法而 存在,起到类似VM Stack的作用,HotSpot 就把 本地和虚拟的合并。
虚拟机栈(VM Stack),又称栈帧(Stack Frame),用于保存局部变量表,操作栈,动态链接,方法出口
一个方法的调用到执行完成,就是一个VM Stack的入栈到出栈过程。
局部变量表,存储单位为slot(对于不同的OS,slot不变),存放在局部变量表中的数据,包括8大基础类型和reference类型(表示一个对象的起始地址,或句柄或其他代表位置的)和returnAddress类型(指向一条字节码指令的地址),除了long和double占2个slot,其他都1个
StackOverFlow 异常: 请求的栈深度大于JVM允许范围
OutOfMemory异常: 当JVM允许VM Stack动态扩展时,无法申请到足够内存是抛出(大部分现存JVM允许)
程序计数器: 程序执行的字节码行号指示器,当处理多线程时,需要每个线程的程序计数器保存当前线程进行字节码命令行
方法区,
用于存放类信息,静态变量,常量等数据,GC效果差,比较少
运行时常量池(Runtime Constant Pool), Class文件中保存了常量池(Constant Pool Table), 用于存放编译时期生成的各种字面量和符号引用, 将会在类加载后存放到运行时常量池
Java语言可以在运行时,载入常量,比如使用String.intern()方法
堆,
内存中存放 对象实例的地方,所线程共享,经常被GC,大小通过-Xms , -Xmx 来配置(最好的优化方式是,选择合适的值,将-Xms和-Xmx设置大小一样,避免频繁的GC)
JVM外 内存 , 称为 直接内存
JAVA 可以在 NIO 模式下,基于Channel或Buffer的I/O模式中,用到直接内存(jvm控制外),包括native方法也可以直接操作直接内存,应该也可能发生OutOfMemory 异常