Java 对象内存分析

一直对堆内存和栈内存搞不明白,最近看了一个视频,有了新的了解,在这里给你们分享一下java

对象内存与引用

对象

好多刚入门学习 Java 的人老是搞不清楚类和对象的关系,在这里简要说明一些。
类:顾名思义,一类东西,好比女孩、男孩、人、狗狗,都是类(class),莹莹、小明、团团,则是对象(object)。
也能够理解为对象是类的具体化(实例),类是泛指,对象是有具体指向。
class Dog 中,Dog 是类编程

public class Dog {
      public String color;
      public String name;
      public Integer age;
}

tuan = new Dog 中,tuan 是对象,是 Dog 类的实例,每一个狗狗的名字,颜色、年龄,都不同。less

tuan = new Dog();
tuan->color = "white";
tuan->name = "tuan";
tuan->age = 3;

这样咱们就定义了一个完整的对象 tuan,能够看到,类只是定义了狗应该有的属性,名字,年龄,颜色,可是并无说明是什么样的狗,对象则指向具体是哪只狗狗,狗狗名字是什么,年龄多少,颜色是什么。学习

内存

能够简单的理解一个电影院,有多少位置。好比有100个位置,则内存就是100。
堆内存:保存对象的具体信息,好比:第三排,第三号的座位 C,则 C 的具体信息(座椅大小、材质、柔软度、颜色,可否调节),就保存在堆内存中
栈内存:保存对象的位置,好比:第三排,第三号(位置为 33 号),则 33 号存储在栈内存中

关系如上图,一个座位号对应一个座位。eg: public class Site{}, Site 是位置信息,c = new Site()。当咱们 new 一个对象时,就会在堆内存中开辟一个空间,存储对象信息。好比,在电影院里3排3座放一个椅子,这个椅子叫作 c,他的位置是3排3号(电影票,在取票箱中),咱们能够根据电影票找到对应的座椅。座椅是有属性的,c->size = 23,则对应的存储信息以下图:
code

引用

能够简单暴力的理解为引用对象的地址,即栈内存中的地址,好比:视频

c = new Site();
c->size = 23;
// c1 引用 c 的地址
c1 = c;
// return c1->size; 输出: 23
c1->size = 24;
//return c->size; 输出: 24
// 因为 c 和 c1 指向的都是同一个对象,所以改动以后都会变化

内存垃圾

c = new Site();
d = new Site();
d = c; // d 和 c 指向一个对象

垃圾内存不能再被使用,但仍然占据内存空间不放,在随后的一个不肯定的时间被垃圾回收器收走(释放掉
以下图:对象

本文参考视频: Java 面向对象编程blog

相关文章
相关标签/搜索