前言
Java语言除了原始数据类型(八大基本类型)外,还有一种类型被称之为引用类型。对象的创建一般需要使用new关键字,将创建的对象存储在堆上(heap)。而在线程栈(stack)中会保留一个指向堆上地址的引用(地址值),在java中,每个方法执行前都会产生一个栈帧,栈帧里存着方法所需的变量
System.out.println(new TestModel3()
.setName("A")
.setAge("18")
.setSex("男")); // TestModel3@23fc625e -> 这就是该对象在栈中保留的地址引用
对象的创建
当实例化`(new)`一个对象时,如果是一个Integer对象,那么JVM首尝试为此对象找到足够的堆空间
1. 如果可分配的空间足够 -> 调用其构造函数,初始化新分配的对象。最后,JVM在变量中存储一个指向该对象在堆内的一个内存地址。
2. 如果可分配的空间不足 -> 那么JVM首先会调用GC(垃圾回收机制)来腾出一部分空间。如果还是无法满足创建对象的要求,那么JVM则会抛出`OutOfMemoryError`异常并放弃对象的创建。
GC(垃圾回收机制)
GC`(垃圾回收机制)`是Java管理对象生命周期的重要组成部分,在Java中你创建对象可以使用new关键字来处理,但是Java中没有提供与之对应的delete关键字来处理对象的销毁操作。
这就使得我们的应用程序存在内存耗尽的风险。Java为了避免开发者滥用对象的销毁操作,提供了GC机制,
对象的销毁操作由JVM来自己管理,这样可以帮助开发者,从频繁的对象销毁处理操作中解放出来。
当程序试图创建一个新对象并且堆中没有足够的空间时,垃圾收集器开始工作。当收集器查看堆时,请求线程被挂起,尝试查找程序不再使用的对象,并回收它们的空间。
如果收集器无法释放足够的空间,并且JVM无法扩展堆,则new运算符将因OutOfMemoryError而失败。则会关闭您的应用程序。