Java虚拟机-对象

 
  • 文章目录
    • 一、创建对象流程
    • 二、对象内存布局
    • 三、对象访问定位

一、创建对象流程

new

二、对象内存布局:

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

三、对象访问定位:

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

四、Java堆溢出

  1. 代码事例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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异常

1
2
3
4
5
6
7
8
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)


 评论