Java内存区域与内存溢出异常 -- 运行时数据区域

程序计数器

  • 是一块较小的内存空间,取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复都是依赖这个计数器完成
  • 每条线程都有一个独立的程序计数器,各线程计数器互不影响,独立存储,这类内存区域称为"线程私有"内存

JAVA虚拟机栈

  • 线程私有,生命周期与线程相同
  • 基本数据类型,boolean、byte、char、short、int、float、long、double
  • 对象引用,reference类型,returnAddres类型(指向了一条字节码指令的地址)
  • 64位的long和double类型的数据会占用2个局部变量空间(Slot)

本地方法栈

  • 虚拟机栈是为虚拟机执行java方法服务
  • 本地方法栈为虚拟机使用的Native方法服务

Java堆

  • 线程共享的一块内存
  • 垃圾收集器管理的主要区域,也称为"GC堆"(Garbage Colected Heap)
  • Java堆物理上可以不连续,逻辑上是连续的即可

方法区

  • 与java堆一样,各个线程共享的内存区域,又称为Non-Heap(非堆)

运行时常量池(Runtime Constant Pool)

  • 方法区的一部分
  • Class常量池存放编译期生成的各种字面量和符号引用
  • 运行时常量池相对于Class常量池另一个重要特征是具备动态性

直接内存

  • 不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域
  • JDK1.4中引入 NIO(New Input/Output类),引入了一种基于通道(Channel)与缓冲区(Buffer)的IO方式
  • NIO可以使用Native函数库直接分配堆外内存,然后通过Java堆中的DirectByteBuffer对象作为这块内存的引用
  • 本机直接内存的分配不会受到Java堆的大小限制
原文地址:https://www.cnblogs.com/YC-L/p/13159583.html