java内存分析
2014-04-02 17:45
113 查看
在JAVA中,内存的管理分为Stack—栈,Heap—堆,DataSegment—数据段,Code Segment—代码段。
首先,先明确每一块区域存放的是什么内容。
Stack:可以翻译为栈区域,存放一些基本数据类型,局部变量,常量,对象的引用地址。
基本的数据类型为最基本的四类八种类型。如下图所示
指令代码就是一些函数和方法。
常量和对象的引用地址可以理解为定义的变量。但是只是引用地址,真正new出来的存放在heap中,即堆内存中。
Heap:存放对象实例,即在代码中new出来的东西全部放在此处。
DataSegment:数据段,存放静态常量和字符串常量。
CodeSegment:代码段,存放代码。
简单的内存分析图形如下红色标识
栈和堆的一些特点我通过图形进行了一些简单的对比
下面就以一个简单的实例分析下内存的存取
[java] view
plaincopy
class Person{
int id;
int age;
Person(int age, int id){
this.age=age;
this.id=id;
System.out.println("ID:"+id+"年龄"+age);
}
}
public class Test01 {
public static void main(String[] args) {
Person per=new Person(25,123);
}
}
函数首先从mian执行
先创建一个per的局部变量在栈中
通过new创建一个Perosn的动态内存,在堆中分配空间,
最后调用构造函数,通过this指针自身给id和age赋值,并将pe局部变量的引用指向对应的堆空间
通过内存分析,我们可以看出,创建对象,实质上在堆中动态的给变量分配一块内存空间,并将变量指向堆空间,也成为引用。
首先,先明确每一块区域存放的是什么内容。
Stack:可以翻译为栈区域,存放一些基本数据类型,局部变量,常量,对象的引用地址。
基本的数据类型为最基本的四类八种类型。如下图所示
指令代码就是一些函数和方法。
常量和对象的引用地址可以理解为定义的变量。但是只是引用地址,真正new出来的存放在heap中,即堆内存中。
Heap:存放对象实例,即在代码中new出来的东西全部放在此处。
DataSegment:数据段,存放静态常量和字符串常量。
CodeSegment:代码段,存放代码。
简单的内存分析图形如下红色标识
栈和堆的一些特点我通过图形进行了一些简单的对比
下面就以一个简单的实例分析下内存的存取
[java] view
plaincopy
class Person{
int id;
int age;
Person(int age, int id){
this.age=age;
this.id=id;
System.out.println("ID:"+id+"年龄"+age);
}
}
public class Test01 {
public static void main(String[] args) {
Person per=new Person(25,123);
}
}
函数首先从mian执行
先创建一个per的局部变量在栈中
通过new创建一个Perosn的动态内存,在堆中分配空间,
最后调用构造函数,通过this指针自身给id和age赋值,并将pe局部变量的引用指向对应的堆空间
通过内存分析,我们可以看出,创建对象,实质上在堆中动态的给变量分配一块内存空间,并将变量指向堆空间,也成为引用。
相关文章推荐
- Java内存分配分析
- java内存分析【精辟】
- 【深入Java编程】JVM源码分析之堆外内存完全解读
- Java运行内存分析
- [转]java线程安全、jstack\线程dump、内存查看分析总结
- Java内存消耗多分析
- Java_32_面向对象_内存分析
- (转帖) java内存分配分析/栈内存、堆内存
- LINUX类主机JAVA应用程序占用CPU、内存过高分析手段
- 分析Java内存分配的栈、堆以以及常量池详细的讲解了其的工作原理。
- 《JVM故障诊断指南》之3 —— Java 线程: JVM持有内存的分析
- Java学习笔记-类与对象(对象内存分析)
- 可能是最详细的Java内存分析实战
- 转下你假笨的一篇java堆内存分析
- java内存分配分析/栈内存、堆内存
- java 内存溢出分析
- java 单例设计模式与单例内存分析,向上转型注意事项
- Java HashMap 分析之四:查找和内存使用
- 如何让Java应用把当前内存情况输出到文件中供分析
- java内存分配分析/栈内存、堆内存