MyBlog
## **一、对象实例化操作初步分析**
Java之中类属于引用数据类型,引用数据类型中面临的困难是要进行内存的管理,同时在进行操作时也会发生有内存关系的变化。
案例程序
```julia
package Demo;
/**
* @author WeiShiDe
* Java内存案例分析
**/
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:" + name + " 年龄:" + age);
}
}
public class JavaDemo {
public static void main(String[] args) {
Person per = new Person(); //声明并实例化对象
per.name = "张三";
per.age = 18;
per.tell();
}
}
```
首先给出两个常用的内存空间
- **堆内存**:保存对象的具体信息,在程序中对内存空间的开辟是通过 new 来完成的。(new有开辟新空间的最高权限)
- **栈内存**:保存对内存的地址,根据地址找到对内存然后找到对象的具体内容,简单理解为:对象名称保存在了占内存之中。**一个栈内存只能够保存有一个对内存的地址数据,如果发生更改,则之前的地址数据将从此栈内存中彻底消失。**
<img src="D:/blog/source/_posts/Java对象内存分析/1.png" referrerPolicy="no-referrer"/>
清楚了以上的对应关系之后,接下来对程序进行分析
<img src="D:/blog/source/_posts/Java对象内存分析/2.png" referrerPolicy="no-referrer"/>
在之前进行分析的时候发现对象的实例化有两种方法,一种是之前使用的声明并实例化对象,另一种就是分步完成,所以下面针对分步的内存操作进行分析
代码部分:
```java
//Person类省略
public class JavaDemo {
public static void main(String[] args) {
Person per = null ; //生命对象
per = new Person(); //声明并实例化对象
per.name = "张三";
per.age = 18;
per.tell();
}
}
```
下面通过内存分析来进行操作
<img src="D:/blog/source/_posts/Java对象内存分析/3.png" referrerPolicy="no-referrer"/>
需要特别注意的是所有对象在调用类中的属性或者方法的时候必须要实例化完成后才可以执行。
错误示范
<img src="D:/blog/source/_posts/Java对象内存分析/4.png" referrerPolicy="no-referrer"/>
代码中只是声明了对象,但是并没有为对象实例化,结果报了无指向异常,就是没有在堆内存开辟后时所产生的异常,并且只有引用数据类型存在有此问题
## 二、引用传递分析
类本身属于引用数据类型,所以会牵扯到内存的引用传递(本质:同一块内存空间可以被不同的栈内存所指向,也可以更换指向)。
范例:
<img src="D:/blog/source/_posts/Java对象内存分析/5.png" referrerPolicy="no-referrer"/>
内存分析
<img src="D:/blog/source/_posts/Java对象内存分析/6.png" referrerPolicy="no-referrer"/>
这个时候引用传递是直接在主方法中定义的,也可以通过方法实现引用传递处理。
范例:利用方法实现引用传递处理
<img src="D:/blog/source/_posts/Java对象内存分析/7.png" referrerPolicy="no-referrer"/>
与之前的差别最大的地方在于,此时的程序是将Person类的实例化对象(内存地址、数值)传递到了change()方法之中,由于传递的是一个Person类型,所以change()方法接收的也是Person类型。。。此处的 change(per); 等价于Person temp = per;
<img src="D:/blog/source/_posts/Java对象内存分析/8.png" referrerPolicy="no-referrer"/>
引用传递可以发生在方法上,这个时候一定要观察方法的参数类型,同时也要观察方法的执行过程。
## 三、引用传递与垃圾产生分析
综上一系列的分析之后可以确认,所谓的引用传递的本质就是一场堆内存的调戏游戏。但对于引用传递使用不当会造成垃圾的产生。
范例分析:
<img src="D:/blog/source/_posts/Java对象内存分析/9.png" referrerPolicy="no-referrer"/>
此时已经明确发生了引用传递,并且成功完成了引用传递的处理操作,下面来观察一下其内存的分配与处理流程。
<img src="D:/blog/source/_posts/Java对象内存分析/10.png" referrerPolicy="no-referrer"/>
所谓的垃圾空间就是没有任何栈内存所指向的堆内存空间,所有的垃圾将被 GC(Garbage Collector、垃圾收集器)不定期进行回收并且释放无用内存空间,但是如果垃圾过多一定将影响到GC的处理性能从而降低整体的程序性能。实际开发中,对于垃圾的产生越少越好!

浙公网安备 33010602011771号