A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 张超超 黑马帝   /  2012-4-17 10:15  /  1618 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个java程序在运行的时候,里面的局部变量、静态变量,成员变量、成员方法,系统都是如何为他们分配内存的?

4 个回复

倒序浏览
局部变量、静态变量,成员变量、成员方法

局部变量存在于栈内存中,该局部程序运行完毕,局部变量从栈内存中消失;
静态变量存在于方法区中的static部分,该静态变量所属类一加载,静态变量就会加载;
成员变量的引用 i 存在于栈内存中,具体值 0 存在于堆内存中,
例:
    int i=0;
该程序运行完毕,局部变量从堆内存中消失;
成员方法存在于方法区中的非static部分中,随着对象的建立而加载;
回复 使用道具 举报
堆内存中存放的是new出的对象,new出的对象只包含成员变量。
栈内存中:存放的是局部成员变量。对于基本的数据类型存放的是基本变量的值,而对于对象变量,存放的是堆内存的地址。
静态、常量区:存放的是静态变量(类变量)或是常量。
方法区:存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法。
回复 使用道具 举报
java中内存主要包含4块:堆内存、栈内存、静态变量或是常量存放区和方法区,其中
堆内存中:存放的是new出的对象,new出的对象只包含成员变量。堆的内存管理一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
栈内存中:存放的是局部成员变量。对于基本的数据类型存放的是基本变量的值,而对于对象变量,存放的是堆内存的地址。其中栈是由编译器自动分配释放的
静态、常量区:存放的是静态变量(类变量)或是常量。
方法区:存放的是对象的方法。
回复 使用道具 举报
内存管理就三种,堆、栈和静态的。
成员变量不应该和局部变量、全局变量、静态等对比,因为它可能是其中的任何一种。

静态:
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.

栈(stack):
     是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量. 在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域)

堆:
java的堆是一个运行时数据区,类的实例(对象)从中分配空间。
java虚拟机(jvm)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,
但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收 来负责的。

至于具体虚拟机运行java程序时这些静态的、动态的、局部的数据存在哪里,可以认为java定义了三个类专门用来管理这些数据,再具体的细节就没必要深究了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马