一、创建对象流程
二、对象内存布局:
- 对象头
- 存储对象自身的运行时数据
- 类型指针:指向此类的元数据的指针,确定这个对象是那个类的实例
- 实例数据:对象真正存储的有效信息
- 对齐填充:不是必然的(起到占位符的作用吧)
三、对象访问定位:
- 在Java程序中要通过栈上的reference数据来操作堆上的具体对象,方式:
- 句柄
- 说明图:
-
优点:reference中存储的是稳定的句柄地址,对象移动时只会改变句柄中的实例数据指针,reference本身不需要修改。
- 指针
- 说明图:
- 优点:速度快,节省了一次指针定位的时间开销。
四、Java堆溢出
- 代码事例:
package com.java.basics;
import java.util.ArrayList;
import java.util.List;
/**
* VM options:
* -Xms1m -Xmx2m
*/
public class DuiTest {
static class OOBject{}
public static void main(String[] args) {
List<OOBject> list=new ArrayList<>();
while (true){
list.add(new OOBject());
}
}
}
输出结果:明显看到了OutOfMemoryError异常'
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at com.java.basics.DuiTest.main(DuiTest.java:14)
网友评论