JVM(内存区域)

在JVM中内存管理中一般分为以下5大区域

所有在JVM上面执行的Java程序 单位是线程 这个大家要理解

1.程序计数器

 线程私有的 当前线程所执行的字节码的行号指示器,没有内存溢出的定义

2.Java 虚拟机栈

 线程私有的 描述了Java方法执行的内存模型 每个方法执行都会创建一个栈帧 执行方法相当于这个栈帧出站和入栈

 虚拟机上的"局部变量表"存储了基本数据类型 和对象的引用(这个不同于对象本身)

如果线程请求的栈深度大于虚拟机所允许的深度 将会抛出StackOverflowError异常

如果虚拟机可以运行拓展的话 大部分的虚拟机都可以动态的拓展

如果拓展还是无法申请到足够的内存,就会抛出OutOfMemoryError异常

本地方法栈

线程私有的 这个和Java虚拟机栈所发挥的作用是很相似的 只不过Java虚拟机栈执行的是Java服务 而本地方法栈执行的是本地服务

与虚拟机栈一样会抛出 StackOverflowError异常和OutOfMemoryError异常

Java堆

这个是所有线程共享的一块内存区域 也是GC(Java垃圾回收器)主要的应用内存区域

存储对象的实例

如果内存不够大(一般主流的虚拟机支持这样设置Java堆的大小通过-Xmx和-Xms控制) 堆中没有内存可以完成实例分配,而且堆也无法在拓展时,将会抛出OutOfMemoryError异常

方法区

与Java堆一样是所有线程共享的区域 它用户存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据.虽然Java虚拟机规范的把方法去描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来

当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

运行时常量池

是方法区的一部分.Class文件有一项信息时常量池,用于存放编译期生成的各中字面量和符号引用.这部分内容将在类加载后进入方法区的运行时常量池存放

当常量池无法在申请到内存是会抛出 OutOfMemoryError异常

直接内存

直接内存并不是虚拟机运行时内存区域的一部分 也不是Java虚拟机规范定义的内存区域 但这块区域经常被使用,因此也可能导致OutOfMemoryError异常出现

       在JDK1.4新加入了NIO类,引入了一种基于通道与缓冲区的I/0方式 它可以使用本地方法直接分配堆外的内存,然后通过一个存储在Java堆中的DirectByteBuffer对象

       作为这块内存的引用进行操作,这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据

      显然既然是内存还是是受到限制的会根据实际内存设置-Xmx等参数信息,但经常直接忽略直接内存

      从而导致动态拓展时出现OutOfMemoryError异常

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值