Java内存区域与内存溢出异常 -- 运行时数据区域
Posted yc-l
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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堆的大小限制
以上是关于Java内存区域与内存溢出异常 -- 运行时数据区域的主要内容,如果未能解决你的问题,请参考以下文章