Java内存区域
2015-03-27 22:25:41 10 举报
AI智能生成
java内存区域学习思路
作者其他创作
大纲/内容
运行时数据区组成
线程私有
程序计数器
当前线程所执行的字节码的行号指示器
虚拟器栈
存储局部变量表、操作数栈、动态链接、方法出口
本地方法栈
为虚拟机使用到的native方法服务
线程共有
方法区
存储类信息、常量、静态变量JIT编译产生的代码
运行时常量池
存放编译产生的字面量和符号引用
堆
分为新生代和老年代
用于存储对象实例和数组
物理连续,逻辑不连续
是gc管理的主要区域
垃圾收集器
带有压缩整理功能
内存绝对规整
用“指针碰撞”来分配内存
不带有压缩整理功能
内存不规整
用“空闲列表”来分配内存
对象的创建
检查参数是否在常量池中定位到一个类的符号引用
若没有做进行类加载
若有则分配内存
内存绝对规整
用“指针碰撞”来分配内存
内存不规整
用“空闲列表”来分配内存
考虑同步问题
采用CAS和失败重试保证操作的原子性
每个线程分配一块本地线程分配缓冲区
对象的内存布局
对象头
存储运行时数据
存储类型指针
实例数据
是对象真正存储的有效信息
对齐填充
起占位符的作用
对象的访问定位
使用句柄
堆中有句柄池,存储到实例数据和类型数据的指针
地址相对稳定
直接指针
直接存储对象地址,到类型数据的指针包含在对象实例数据中
访问速度快
OOM异常
堆溢出
java.lang.OutOfMemoryError后会跟Java heap space
虚拟机栈和本地方法栈溢出
单线程只报stackoverflowError
多线程会出现OOm错误,可通过减少堆内存来解决
方法区和运行时常量池溢出
java.lang.OutOfMemoryError后会跟PermGen space
本机直接内存溢出
在Heap Dump文件中没有明显异常
0 条评论
下一页