对象

一、创建对象流程

二、对象内存布局:

  1. 对象头
  • 存储对象自身的运行时数据
  • 类型指针:指向此类的元数据的指针,确定这个对象是那个类的实例
  1. 实例数据:对象真正存储的有效信息
  2. 对齐填充:不是必然的(起到占位符的作用吧)

三、对象访问定位:

  1. 在Java程序中要通过栈上的reference数据来操作堆上的具体对象,方式:
  • 句柄
    • 说明图:
    • 优点:reference中存储的是稳定的句柄地址,对象移动时只会改变句柄中的实例数据指针,reference本身不需要修改。

  • 指针
    • 说明图:
    • 优点:速度快,节省了一次指针定位的时间开销。

四、Java堆溢出

  1. 代码事例:

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 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)

你可能感兴趣的:(对象)