内存模型&分区
- Java虚拟机在运行Java程序时,会管理着一块内存区域:运行时数据区
- 在运行时数据区里,会根据用途进行划分:
- Java虚拟机栈(栈区)
- 本地方法栈
- Java堆(堆区)
- 方法区
- 程序计数器
1.Java堆内存
-
Java堆内存的定义:堆内存(Heap),是垃圾回收机制管理的主要区域,能够称为:GC堆java
-
Java堆内存的做用:主要就是存放Java对象的实例函数
-
Java堆内存的特色:JVM内存中最大而且线程共享性能
-
Java堆内存出现的异常:OutOfMemoryError异常,堆内存中没有足够的内存完成对象实例的分配而且堆没法再继续扩展。学习
-
Java堆内存备注说明:线程
- 从内存回收的角度分为:新生代和老年代,若是深刻在进行查询学习
- 从内存分配的角度至关于:多个线程私有的分配缓冲区
2.Java虚拟机栈
- Java虚拟机栈:栈内存(Stack),是Java方法执行的内存模型
- 栈内存的做用:存储Java方法执行时的局部变量
- 以帧栈的形式
- 含数据类型和对象的引用(地址)
- 方法执行结束后就释放
- 栈内存的特色:线程是私有的,生命周期与线程相同
- 栈内存常见的异常:
- OutOfMemoryError异常:虚拟机栈扩展时没法申请到内存空间
- StackOverflowError异常:线程请求栈深度 > 虚拟机所容许的深度
- 栈内存备注:
- 每一个Java方法执行时都会建立一个栈帧
- 一个Java方法从被调用到执行完成 等价于 一个栈帧在虚拟机栈中的入栈到出栈
- 局部变量所须要内存空间在方法编译时就会完成分配,在方法运行时不会改变大小
3.本地方法栈
相似于Java虚拟机栈,与Java虚拟机栈区别在于:服务的对象3d
- Java虚拟机栈为执行Java方法服务;
- 本地方法栈为执行Native方法服务;(百度一下:Native方法是什么方法)
4.方法区
- 方法区是堆的一个逻辑部分,为了与Java堆区分,能够称为:“非堆”区域(None - Heap)
- 方法区的做用:存储已被虚拟机加载的 类信息、常量、静态变量等数据
- 方法区的特色:线程是共享的
- 方法区常见的异常:OutOfMemoryError异常,当方法区没法知足内存分配需求
- 方法区的备注:
- 该区域的内存回收主要是针对于运行时常量池和对类的卸载
- 又称“永久代”:回收条件苛刻,不多出现垃圾收集
运行时常量池单独说明
- 常量池是方法区的一部分
- 常量池的做用是:存放类文件的编译时生成的各类字面量&符号引用
- 常量池的特色是:动态性,运行时能够添加新的常量,例如:
java.lang.String类中的intern()方法
- 常量池常见的异常:OutOfMemoryError异常,当常量池没法申请到内存时
5.程序计数器
- 程序计数器是指当前线程所执行的字节码的行号指示器
- 程序计数器做用是实现异常处理、线程恢复等基础功能
- 程序计数器原理是经过改变计数器的值,来选取下一条执行的字节码指令
- 程序计数器的特色:A.线程是私有的 B.内存空间比较小
- 程序计数器常见的异常:惟一一个在JVM中无任何OutOfMemoryError的内存区域
- 程序计数器备注:
- 线程私有的内存区域
- 为了使用线程切换后恢复到正确的位置
- 每条线程都配有独立的程序计数器,各个线程互不影响
- 独立存储的内存区域
6.额外备注:直接内存
- 定义:NIO类(JDK1.4引入)中基于通道和缓冲区的I/O方式,经过使用Native函数库直接分配的堆外内存
- 特色:不受堆大小限制
- 应用场景:适用于频繁调用的场景
经过一个 存储在Java堆中的DirectByteBuffer对象 做为这块内存的引用 进行操做,从而避免在Java 堆和 Native堆之间来回复制数据,提升使用性能code
这段须要有一些知识储备才好!cdn
- 抛出的异常:OutOfMemoryError,即与其余内存区域的总和 大于 物理内存限制