java内存区域与内存溢出异常

2.1概述:如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作。

 

2.2 运行时数据区域
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据库区域。
这些区域都有各自的用途,以及创建和销毁的世界,有的区域随着虚拟机进程的启动而存在,
有些区域则依赖用户现场的启动和结束而建立和销毁。

程序计数器(线程私有的):
当前线程所执行的字节码的行号指示器。

java虚拟机栈(线程私有的)
java方法执行的内存模型
每个方法执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息

本地方法栈(与虚拟机栈所发挥的作用类似)
虚拟机使用到的Native方法时,使用到。

java堆(所有线程共享)
在虚拟机启动时创建,
作用:存放对象实例
细分:新生代和老年代,Eden恐惧、From Survivor、To Survivor。
内存分配角度:线程共享的java堆中可能怀芬出多个线程私有的分配缓冲区。

方法区(所有线程共享)
作用:存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
有的JDK,会把GC分代收集扩展至方法区,或者说使用永久代来实现方法区。

运行时常量池
运行时常量池是方法区的一部分。

直接内存
并不是虚拟机运行时数据区的一部分。
jdk1.4中新加入了NIO类,引入了一种基于通道与缓冲区的I/O方式,
它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块
内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值