对象

作者: Lucksheep | 来源:发表于2019-05-15 16:11 被阅读0次

    一、创建对象流程

    二、对象内存布局:

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

    相关文章

      网友评论

          本文标题:对象

          本文链接:https://www.haomeiwen.com/subject/mgzpaqtx.html