JAVA对象及属性的内存堆栈管理(通过小程序简单说明)
2014-10-29 11:43
281 查看
JAVA在执行过程中会划分4个内存区域(heap、stack、data segment、code segment)
代码区(codesegment):java开始执行会把代码加载到code segment区域然后找到main方法开始执行
静态区(datasegment): 是存放静态变量字符串常量
堆区(heapsegment): 一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源
下面通过一个例子了解一下:
总结:
1.一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄一定是存放在栈中。
2.他们的引用可能存放在堆中,也可能存放在栈中,通过example1中可以看出局部变量创建的对象是在栈中,而new 的 对象中的属性例如jvm_A.A是存放在堆中,而指向栈中的数据。
3.静态变量例如static int B 是存放在静态区(datasegment)中,他不属于任何对象。
代码区(codesegment):java开始执行会把代码加载到code segment区域然后找到main方法开始执行
静态区(datasegment): 是存放静态变量字符串常量
堆区(heapsegment): 一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源
下面通过一个例子了解一下:
package com.chinasofti.mylove; public class JVMSpace { private int A = 0; private static int B = 0; public void example1() { // 说明基本类型的数据及引用都是存放在栈内存中 int a = 0; int b = 0; System.out.println(a == b);// 如果栈内存中存在0,那么a和b同时指向这个数据 b = a; a = a + 1;// a=1,栈中没有1,所以a指向1 System.out.println(b);// b的值没有变化还是0 } public void example2() { int a = 0; JVMSpace jvm_A = new JVMSpace(); System.out.println(jvm_A.A == a);// 发现是相等的,证明虽然jvm_A.A存放在堆中,但是只存放了引用,实际指向还是在栈中 } public static void main(String[] args) { JVMSpace jvmSpace = new JVMSpace(); jvmSpace.example1(); jvmSpace.example2(); } } |
1.一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄一定是存放在栈中。
2.他们的引用可能存放在堆中,也可能存放在栈中,通过example1中可以看出局部变量创建的对象是在栈中,而new 的 对象中的属性例如jvm_A.A是存放在堆中,而指向栈中的数据。
3.静态变量例如static int B 是存放在静态区(datasegment)中,他不属于任何对象。
相关文章推荐
- JAVA对象及属性的内存堆栈管理(通过小程序简单说明)
- JAVA对象及属性的内存堆栈管理(通过小程序简单说明)
- 小example说明java的值传递和引用传递,基础变量和对象在内存里的区别,堆栈
- (java)snmp 管理中心程序简单分析,欢迎拍砖
- 一个简单的内存管理程序
- Java通过反射实现简单对象的拷贝
- java程序会发生内存泄露的问题吗?请简单说说你的观点
- 改善C++ 程序的150个建议学习之建议34:用智能指针管理通过new创建的对象
- Java程序开发中的简单内存分析
- 持久层框架中通过Record对象获取Blob对象值导致java堆栈溢出的问题
- Java程序计算各种对象所占内存的大小的方法
- JAVA客户端程序在Spring中配置Log4j的简单说明
- linux下java程序与C语言程序通过SOCKET通信的简单例子
- log4j日志管理系统简单使用说明 - open java project(转载)
- java程序运行时,对象的放置和内存的分配
- Java程序开发中的简单内存分析
- linux两个程序通过共享内存通信的一个简单例子
- 通过JAVA反射实现简单的ORM,将查询结果封装为对象
- Java和C++在堆栈中创建对象的简单对比
- 如何通过mat从java内存dump中找到缓存对象中的所有字符串