J2SE - 内存解析
来源:互联网 发布:国内主机推荐 知乎 编辑:程序博客网 时间:2024/06/05 14:53
先声明几个内存分析的小规则:
1.局部变量,基础类型的,只占一块内存
2.形参等同于局部变量,在栈内存中分配空间,值为实参传的值
3.方法执行完后,为此方法分配的所有局部变量的内存空间消失,在堆内存中对应的内存不一定马上消失,垃圾收集器回收时就消失了
下面我用例子来解释这几个规则
这是主函数:
public static void main(string args[]){Test test = new Test();int date = 9 ;Birthday b1 = new Birthday( 7, 7, 1970); Birthday b2 = new Birthday( 1, 1, 2000);test.Change1(date);test.Change2(b1);test.Change3(b2); }
没有调用方法之前,内存分配是这样的:
调用方法Change1
public void Change1( int i) { i = 1234 ; }
没有走方法体时:
i是形参,形参等同于局部变量,i的值应为实参date的值,内存分配是这样的
运行到方法体i = 1234 ; i的值被改变,但date的值是不会被改变的
方法被运行完后,为Change1方法分配的内存空间 i消失,内存恢复为:
Change1()方法中什么都没有改变,此方法相当于没有调。
调用方法Change2
public void Change2(BirthDate b){b = new BirthDate(22,2,2016);}
b为局部变量,BirthDate的引用类型,b是形参,所以b的地址和实参b1的地址是一样,他们都可以指向同一个值
当执行方法体
b = newBirthDate(22,2,2016); b又new出来一个新的对象,堆内存里为b分配内存空间
执行完方法Change2()后,局部变量b消失,此方法并没有改变b1。此方法不能把
改变成
b虽然消失了,但堆内存中为b创建的内存不一定会马上消失,等垃圾收集器回收的时候,他就消失了,
调用方法Change3()
public void Change3(BirthDate b){b.SetDay(9);}
SetDay()是BirthDate()里的方法
Public void SetDay(int d){day = d;}
执行方法体
执行方法体后日期被改变
用例子来学习内存解析还是容易理解的,自己敲代码的时候多想想吧。
6 3
- J2SE - 内存解析
- [J2SE基础篇]~类继承,static静态变量内存解析
- 【J2SE】内存分析
- 【J2SE】内存分析
- 内存分析(J2SE专题三)
- J2SE--关于Java占用内存
- 深入解析JAVA细节(J2SE)
- J2SE-程序执行与内存图
- J2SE-程序执行与内存图
- 【J2SE】分析程序的内存分配过程
- 解析J2EE、J2SE、J2ME、JDK的区别
- 解析JDK、J2EE、J2SE、J2ME的区别
- 解析JDK、J2EE、J2SE、J2ME的区别
- 解析JDK、J2EE、J2SE、J2ME的区别
- J2SE
- J2SE
- J2SE?
- J2SE
- jps 命令使用
- C语言
- 谈一下ACM的入门书籍及方法
- PHP中的数组(指针)
- 自定义绘图View之onDraw
- J2SE - 内存解析
- Android异步消息处理机制详解及源码分析
- Shell—函数
- Ubuntu安装中文版WordPress
- c#服务器验证控件基本用法
- React/React Native 的ES5 ES6写法对照表
- Mac安装双系统(win7系统)
- Poedu_C语言提升_Lesson04_符号
- 利用Jquery实现http长连接(LongPoll)