1. 局部变量和成员变量的重要区别
局部变量没有初始化就打印时,会报错。
而成员变量,我们不用初始化,java会自动对它初始化。
当变量是引用的时候,java会赋给它null。
2.
基本类型:在栈中占一块内存。
引用类型:占两块内存,一块在栈,一块在堆。
在栈中的key是这个变量的名字,value值就是它在堆中的地址。
3.
类是静态的概念,它放在代码区。
对象是new出来的,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量),
而方法只有一份,执行的时候才占内存(其余它就是放在代码区中)。
堆内存:是在程序运行时动态分配的。
同一类的每个对象有不同的成员变量存储空间。
同一类的每个对象共享该类的方法。
4.
code,data,stack,heap
局部变量分配在stack.
代码都是放在code segment里面。一旦找到main方法开始执行,其他开始起作用。
5.
写new的时候,就是调用的构造方法。
在写Pserson tom = new Pserson(1,25);的时候:
在栈中开辟了一块新内存,名字是tom,值是一个地址。
同时在堆中开辟了一块内存,里面有1和25两个数据。
但注意:在栈中的内存里的值不是堆中的地址,而是另一个地址。jvm通过这个地址可以找到堆中的相应对象。
当方法调用结束时,栈内存中的局部变量就没有了。而堆中的,是等垃圾回收机制将其回收。
系统添加构造方法,只是在自己没有写任何构造方法时才会加。
6.
基础类型变量:就一处内存。
int date = 9; //则在栈中有一块内存,叫date,值是9.
7.
public static void main(String[] args){
int date = 9;
Test test = new Test();
test.change1(date);
}
public void change1(int i){
i = 1234;
}
在内存中,先开辟一个局部变量,名字是date,值是9.
当执行到test.change1(date)的时候,在栈中开辟另一块内存。
名字是i,然后把date的值赋给i.当执行完change1之后,i所在内存消失。
8.
public static void main(String[] args){
Test test = new Test();
BirthDate d1 = new BirthDate(1,1,2000);
test.change2(d1);
test.change3(d1);
}
public void change2(BithdayDate b){
b = new BirthDate(22,2,2004);
}
public void change3(BithdayDate b){
b.setDay(22);
}
执行change2的时候,在栈中新建个变量b,它里面的值就是栈中d1的值的复制。
然后执行b = new BithDate(22,2,2004)的时候,在堆中新开辟一块给BirthDate的内存。
然后在栈中,把b的值改成新的对应的地址。方法结束时,栈中的b被清除。堆中的BirthDate的对象等待垃圾回收机制把它收回去。
执行change3的时候,在栈中新建个变量b,它里面的值就是栈中d1的值的复制。
然后执行b.setDay(22)的时候,在栈中开辟个新内存,名字是d,值是22。然后,由于setDay(d){day = d; },则把d的值,复制给test对象的day属性当中。方法结束,栈中的d被回收。
9.
double getDistance(Point p){
return p.x + p.y + p.z;
}
public static void main(String[] args){
Point p = new Point(1,2,3);
Point p1= new Point(0,0,0);
System.out.println(p.getDistance(p1));
p.sexX(5.0);
System.out.println(p.getDistance(new Point(1.0,1.0,1.0)));
}
主要是对最后一句话的内存分析:
首先,实例了一个Point对象,三个属性都是1.0.则它会在堆中开辟出这样一块内存。调用了getDistance方法,有个参数p,则会在栈中开辟个新的内存,name是p,而value就指向了堆中新开辟的内存。
将结果输出之后,栈中的p消失
分享到:
相关推荐
jProfiler7 java内存分析 linux版本
JAVA内存分析工具
java内存分析
Java内存分析工具,解决内存泄漏问题
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对 ...
介绍了几种jdk自带的内存分析工具的简单使用,和一些java内置的命令
java内存泄漏分析工具
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
本人学习Java时苦找的内存分析我把它整理成WORD文档供大家学习Java堆栈内存分析笔记。
jProfiler7 java内存分析 里面包含jProfiler7安装版本,及key. 顺带有两个文档,一个en,一个cn. 还有几个html入门介绍及使用,包括案例怎么分析内存泄漏的整个分析解决过程。
java 生成对象的时候以及调用方法的时候,所使用的空间分布,包括对象和变量在内存的存储方式和分布方式的讲解。
java内存分析培训材料,包括jvm内存分析工具、JVM工具与MAT介绍
java内存泄露问题的定位与详细的分析过程
Mac OS java内存分析工具,Eclipse MAT(Memory analyse tool)
基于Java的内存泄露分析及定位,希望对各位有用!
Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它
java内存分析软件套件
Java内存分析工具
MAT Java内存分析工具 超级好用 无敌 !