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环境中的配置和应用。 1. **内存分析概述** - 内存分析是识别和解决Java应用程序中的内存泄漏、过度对象创建和内存消耗过高问题的...
Java内存分析是Java开发中非常重要的一个环节,它关乎到应用程序的性能和稳定性。"JAVA内存分析 - V1.0.0.zip" 提供了一套工具来帮助开发者深入理解并优化Java应用程序的内存使用情况。这个压缩包包含了两个关键文件...
Java内存分析是一个重要的主题,尤其是在开发复杂且性能要求高的应用程序时。内存泄露是Java程序员需要密切关注的问题,因为它们可能导致系统性能下降,甚至可能导致系统崩溃。本文将深入探讨Java内存分析和内存泄露...
Java内存分析工具是Java开发过程中不可或缺的调试利器,主要用于检测和解决内存泄漏问题。内存泄漏是程序运行过程中,无法释放不再使用的内存空间,随着时间推移,会导致系统资源耗尽,性能急剧下降,甚至可能导致...
Java内存分析是一个关键的优化步骤,特别是在开发大型的、高性能的应用程序时。MAT(Memory Analyzer Tool)是由IBM开发的一款强大的Java堆内存分析器,它的全名是Eclipse Memory Analyzer。这款工具是开源的,完全...
在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时主要涉及四种内存区域:程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8及以后版本中...
MAT(Memory Analyzer Tool)是IBM开发的一款强大的Java内存分析工具,它是标题中提到的具体分析工具之一。MAT提供了一种可视化的界面,通过分析heap dump文件,能够帮助我们深入理解Java应用程序的内存使用情况,找...
**Mac OS上的Java内存分析工具MAT** 在Java应用程序开发中,内存管理是至关重要的,特别是对于大型、长期运行的应用程序,内存泄漏可能导致性能下降甚至系统崩溃。为了有效地诊断和解决这些问题,开发人员需要借助...
Java内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。为了有效地诊断和解决这类问题,开发者需要借助...在日常开发中,定期进行内存分析并结合代码审查,是预防和解决内存泄漏的关键步骤。
Java内存分析是优化应用程序性能的关键环节,特别是在处理大型或资源密集型应用时。"dumpAnalyzer"是一个专门用于此目的的工具,它提供了图形化的界面,帮助开发者深入理解系统的内存状况,找出潜在的性能瓶颈。本文...
Java堆栈内存分析是Java编程中的重要概念,它关乎程序的性能优化和内存泄漏的预防。堆和栈是Java内存管理的两个主要区域,它们各自承担着不同的职责。本笔记将深入探讨这两个区域的工作原理以及如何进行有效的分析。...
HeapAnalyzer是一款Java内存分析工具,由IBM开发,它可以帮助开发者检查和分析Java堆内存的状态,找出可能存在的内存泄漏或者过度占用内存的对象。通过分析heap dump文件,HeapAnalyzer可以展示对象的分布情况,识别...
Eclipse Memory Analyzer 是一个功能丰富且轻量的 Java 堆内存分析工具,可以用来辅助发现内存泄漏减 少内存占用。 使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对 ...
MAT 是一个开源的java内存分析工具,能够快速的分析dump文件,可以直观的看到各个对象在内存占用的量大小,以及类实例的数量,对象之间的引用关系,找出对象的GC Roots相关的信息,此外还能生成内存泄露报表,疑似...
要定位内存泄漏,开发者可以使用`-verbose:gc`参数监控垃圾收集,或者借助内存分析工具如JVisualVM。通过观察完全垃圾回收后的内存使用情况,如果内存持续上升,可能存在内存泄漏。 JVisualVM是Java开发者的有力...
介绍了几种jdk自带的内存分析工具的简单使用,和一些java内置的命令
Java内存分析工具ji Java内存分析工具ji是Java程序员不可或缺的工具之一,它可以帮助开发者快速地排查和解决Java内存泄漏问题。在本文中,我们将详细介绍Java内存泄漏的定义、原因、排查方法、解决方案,并提供一个...
IBM HeapAnalyzer是一款强大的Java内存分析工具,主要用于诊断和解决Java应用程序中的内存泄漏问题。这款工具通过对Java堆内存的深入分析,帮助开发者定位那些占用过多内存的对象,从而优化应用性能。在Java开发过程...
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态