Java虚拟机的内存区域

C++和Java之间有堵由内存动态分配和垃圾收集技术所围成的墙,墙外的人想进去,墙内的人却想出去 ---《深入理解Java虚拟机》


程序计数器

  • 每一个Java线程都拥有自己的程序计数器,用于记录当前正在执行的字节码指令的地址
  • 如果一个线程正在执行的是本地方法(Native),则程序计数器的值为空(Undefined)

Java虚拟机栈(单位是slot)

栈帧:

用于存储局部变量表操作数栈动态连接方法出口

局部变量表:
  • 八种基本数据类型:bool,byte,short,char,int,float,double,long,(其中long和double会占据两个变量槽--slot)
  • 对象的引用(例如在方法当中new一个对象,会将引用存放局部变量表中)
    并且,栈帧的大小在编译器就确定了大小(slot的数量)
    slot的大小是由jvm决定的

关于异常

栈帧过深:抛出StackOverflowError,表明栈的深度超出了虚拟机的所允许的深度
内存不够:抛出OutOfMemoryError,表明无法申请到新的内存


本地方法栈

主要用于为本地方法(Native)服务
同时也会像java虚拟机栈一样报出StackOverflowErrorOutOfMemoryError


Java堆

存放所有的对象,数组
在《Java虚拟机规范》中,堆可以处于物理上不连续的内存空间,但在逻辑上应该是连续的。


方法区

用于存储已加载的类型信息,常量,静态变量,即使编译器编译后的代码缓存

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容