`

java里的静态成员变量是放在了堆内存还是栈内存

 
阅读更多

转自http://bbs.csdn.net/topics/370001490

堆区: 

1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 
栈区: 
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 
方法区: 
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 

2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量

 

 

 

程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内在的分配,有六个地方都可以保存数据:
1、 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹
2、 堆栈。驻留于常规RAM(随机访问存储器)区域。但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些java数据要保存在堆栈里——特别是对象句柄,但java对象并不放到其中。
3、 堆。一种常规用途的内存池(也在RAM区域),其中保存了java对象。和堆栈不同:“内存堆”或“堆”最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相碰的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间
4、 静态存储。这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但java对象本身永远都不会置入静态存储空间。
5、 常数存储。常数值通常直接置于程序代码内部。这样做是安全的。因为它们永远都不会改变,有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
6、 非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器,而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技艺就是它们能存在于其他媒体中,一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。

 

首先,java里面是没有静态变量这个概念的,不信你自己在方法里面定义一个static int i =0;java里只有静态成员变量。它属于类的属性。至于他放在那里?楼上说的是静态区。我不知道到底有没有这个翻译。但是 深入jvm里是是翻译为方法区的。虚拟机的体系结构:堆,方法区,本地方法栈,pc寄存器。而方法区保存的就是一个类的模板,堆是放类的实例的。栈是一般来用来函数计算的。随便找本计算机底层的书都知道了。栈里的数据,函数执行完就不会存储了。这就是为什么局部变量每一次都是一样的。就算给他加一后,下次执行函数的时候还是原来的样子。

分享到:
评论

相关推荐

    java线程笔记

    局部变量存储在栈内存中,属于方法调用。 - 成员变量有默认初始化值,如int型默认为0,而局部变量没有默认初始化值,需要显式初始化。 2. **构造函数**: - 构造函数用于初始化新创建的对象。若未定义构造函数,...

    Java基础知识及面试题.pdf

    类的加载过程包括类加载器加载字节码文件到内存、jvm 内存数据区将对象状态放置在堆区、各线程使用的变量放在栈区、类的特征放在方法区,然后进行字节码验证再执行。 7. 类的语法与规范 一个源文件只能有一个 ...

    java秋招笔试面试知识点总结

    它可以用来调用当前对象的成员变量和方法,也可以用于区分实例变量和局部变量。 5. 单例模式:是设计模式中的一种,用来确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。在Java中,单例模式有两种...

    java个人总结,觉得还不错

    - **成员变量与成员方法**:类中的字段称为成员变量,方法称为成员方法。 - **构造器**:用于初始化新创建的对象,构造器的名称必须与类名相同,没有返回类型。 ```java public ClassName() { // 构造器体 } ``...

    java面试问题集锦

    - **接口**:只能包含抽象方法(Java 8之后可以有默认实现),不允许拥有成员变量,但可以有常量。 ##### 重载和重写的区别 - **重载**(Overloading):发生在同一个类中,方法名相同但参数列表不同。 - **重写**...

    corejava高级特性总结.pdf

    在Java中,`static`关键字用于声明成员变量、成员方法或代码块为静态的。静态成员与类绑定,而不是与对象绑定,这意味着它们可以在没有创建类的实例的情况下被访问。 #### 静态属性 静态属性,也被称为类变量,是...

    2018阿里Java面试题70道

    栈内存分配快速,但大小有限。 38. **栈起点与程序起点**:main方法所在类的栈帧是栈的起点,也是程序执行的起点。 39. **基本类型不放堆**:基本类型大小固定,直接存储在栈中,访问速度快。 40. **参数传递**:...

    java经典面试题.doc

    - **静态内部类**:不能访问外部类的非静态成员,可以通过外部类的类名来访问外部类的静态成员。 #### 13. 用JAVA实现一种排序,JAVA类实现序列化的方法(二种) - **排序**:实现快速排序、归并排序等。 - **序列化...

    最新java面试题及答案

    java面试题及答案详解 以下是详细的java知识点解释: 1. Java中的内存溢出是如何造成的?...答案是,Synchronized关键字用于实现同步,它可以使得在同一个对象上的多个线程能够安全地访问该对象的成员变量。

    java面试题大集合

    - **垃圾回收机制**:Java自动管理内存,通过垃圾回收器定期回收不再使用的对象所占用的内存空间,从而避免了程序员手动管理内存的复杂性。 #### 五、在JAVA中,如何跳出当前的多重嵌套循环? 可以通过设置一个...

    超级有影响力霸气的Java面试题大全文档

    接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象...

    java1-6章测试题目.pdf

    4. **JAVA 中的变量**:变量是用来存储数据的容器,分为局部变量(在方法或块内定义)、成员变量(类级别的变量)和全局变量(静态成员变量)。 5. **String 不是基本数据类型**:String是Java的一个类,不是基本...

    Java 自学秘籍(学习之路)(csdn)————程序.pdf

    Java程序运行时,数据会被分配在不同的内存区域中,主要涉及栈、堆、方法区、常量池等。 - **栈**:用于存储局部变量和方法调用的信息。 - **堆**:存放new出来的对象和数组。 - **方法区**:存储类的信息、静态...

    java经典面试题2

    内部类可以直接访问外部类的成员变量和方法,即使它们是私有的。 #### 9. JSP动态Include与静态Include的区别 - **动态Include**:在运行时加载被包含页面的内容,被包含页面的内容可以是动态生成的。例如,使用`...

    Java基础面试知识点总结

    - 基本数据类型(如int, char, byte等)直接存储值,内存分配在栈上,占用空间固定,无需实例化对象。 - 引用数据类型(如类、接口、数组)存储的是对象的引用,实际对象存储在堆中,引用指向该对象。 2. **重载...

    Java后端面试题大纲(涵盖了百分之九十的考点).pdf

    - `static`关键字用于声明静态成员变量和静态方法,表示它们属于类而不是类的实例。 - 静态变量在整个程序运行期间都存在,可以被所有实例共享。 - 静态方法可以直接通过类名调用,无需创建对象。 4. **Java集合...

Global site tag (gtag.js) - Google Analytics