深入理解JAVA虚拟机读书笔记之Java内存区域与内存溢出异常

Java运行时数据区域

1.程序计数器(Program Counter Register)

每个线程都有一个独立的程序计数器.
这个计数器记录的是正在执行的虚拟机指令的字节码指令地址,如果正在执行Native方法,这个计数器值为空(undefined)
这个区域是唯一不会OOM的

2.Java虚拟机栈(java Virtual Machine Stacks)

线程私有
虚拟机栈为虚拟机执行java方法
经典的StackOverflowError,OutOfMemoryError

3.本地方法栈(Native Method Stack)

虚拟机用到的native方法

4.堆

所有的对象实例以及数组都要再堆上分配,java虚拟机规范原文(The heap is the runtime data area from which memory
for all class instances and arrays is allocated. int []?)

5.方法区Method Area

存储已被线程加载的类信息,常量,静态变量,其实方法区称为永久代(Permanent Gereration)
早期的String.intern()-XX:MaxPermSize实现为方法区上分配后java7改为堆上分配,这样可用区域更大.所以建议使用String.itern()字符串池具体参考
String.itern字符串池

6.运行时常量池(Runtime Constant Pool)

其实是方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容,将在类加载后进入方法去得运行时常量池存放,java6 or 之前的String.itern实现依赖于它

7.Direct Memory

直接内存,好吧NIO中的DirectByteBuffer使用了这货,使用native函数直接分配堆外
内存。
参考NIO trick and trap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值