自动内存管理机制-2.Java内存区域与内存溢出异常

目录

1运行时数据区域

1.1程序计数器

1.2Java虚拟机栈

1.3本地方法栈

1.4Java堆

1.5方法区

1.5.1运行时常量池

1.6直接内存

2HotSpot虚拟机对象探秘

2.1对象的创建

2.2对象的内存布局

2.3对象的访问定位

3实战:OutOfMemory异常

3.1Java堆溢出

3.2虚拟机栈和本地方法溢出

3.3方法区和运行时常量池溢出

3.4本机直接内存溢出


1运行时数据区域

1.1程序计数器

字节码指令的偏移地址

1.2Java虚拟机栈

1.3本地方法栈

和Java虚拟机栈相似,不过是用于Native方法。

在HotSpot中合二为一。

1.4Java堆

存放对象实例和数组

1.5方法区

从永久区(PermGen)到元空间(Metaspace)

1.5.1运行时常量池

1.6直接内存

 

2HotSpot虚拟机对象探秘

2.1对象的创建

  • 加载:

  • 分配内存:

分配方式:

线程安全性问题:

  • 初始化:

  • 对对象进行必要设置(设置对象头):

  • <init>初始化

收敛顺序为

1. 父类变量初始化 
2. 父类代码块 
3. 父类构造函数 
4. 子类变量初始化 
5. 子类代码块 
6. 子类构造函数

2.2对象的内存布局

  • 对象头:Markword+类型指针

类型指针:

即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。

  • 实例数据

实例数据部分是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。

  • 对其填充

对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起占位作用。 因为 Hotspot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,换句话说就是对象的大小必须是 8 字节的整数倍。而对象头部分正好是 8 字节的倍数(1 倍或 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。

2.3对象的访问定位

3实战:OutOfMemory异常

3.1Java堆溢出

3.2虚拟机栈和本地方法溢出

-Xoss 设置 本地方法栈大小(但在HotSpot虚拟机中不区分本地方法栈和虚拟机栈,故无效)

-Xss 设置虚拟机栈

3.3方法区和运行时常量池溢出

-XX:PermSize:表示非堆区初始内存分配大小
-XX:MaxPermSize:表示对非堆区分配的内存的最大上限

3.4本机直接内存溢出

-XX:MaxDirectMemorySize,若不指定和堆最大值一样

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值