`

关于java成员变量与局部变量以及成员方法的内存区别问题

    博客分类:
  • jvm
 
阅读更多

今天去面试遇到了有关成员变量与局部变量以及成员方法的问题,主要是涉及所处内存的问题和初始化问题,简单的总结一下:

 

1.java中成员变量处在堆内存(成员方法不调用时存在方法区中的静态区)中,局部变量处在栈内存中;

 

知其然知其所以然,我们简单了解一下Java内存分配:

 

一个完整的Java程序运行过程会涉及以下内存区域:

 

寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。

 

***堆:***用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。类的方法是所有的同类对象共享的,方法是存在方法区的(下面会有对方法区的介绍),只用当调用的时候才会被压入栈,不用的时候只占用方法区的内存

 

栈:保存局部变量的值,包括:1.用来保存基本数据类型的值(注意“的值”二字);2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。存储在堆中的对象是全局可以被访问的,然而栈内存不能被其他线程所访问。

 

对于局部变量,如果是基本类型,会把值直接存储在栈;如果是引用类型,比如String s = new String(“william”);会把其对象存储在堆,而把这个对象的引用(指针)存储在栈。

再如

String s1 = new String(“william”);

String s2 = s1;

s1和s2同为这个字符串对象的实例,但是对象只有一个,存储在堆,而这两个引用存储在栈中。

类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中),基本类型和引用类型的成员变量都在这个对象的空间中,作为一个整体存储在堆。而类的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。

 

方法区: JAVA 方法区与堆–java7前,java7,java8各不相同(可点击查看)

 

方法区又被称为静态区,是程序中永远唯一的元素存储区域。和堆一样,是各个线程共享的内存区域。它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

 

Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样 不需要连续的内存和可以选择固定大小或者可扩展之外,还可以选择不实现垃圾回收。

这区域的内存回收目标主要是针对常量池(已经在jdk1.7后被转移到堆)的回收和类型的卸载,一般而言,这个区域的内存回收比较难以令人满意,尤其是类型的回收,条件相当苛刻,但是这部分区域的内存回收确实是必要的(所以开发新项目尽量使用1.7以上的版本)。

 

很多开发者更愿意把方法区称为“永久代”(Perm Gen)(Permanent Generation)「总是存放不会轻易改变的内容」。在目前已经发布的JDK 1.7 的HotSpot中,已经把原本放在永久代的字符串常量池移至堆中。

 

运行时常量池(Runtime Constant Pool)是方法区的一部分。

 

常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。jdk1.7以后常量池存在于堆中。

 

代码段:用来存放从硬盘上读取的源程序代码。

 

数据段:用来存放static定义的静态成员。

 

最后我们来个栈堆的区别总结:

堆内存和栈内存的区别

基于上边的解释我们可以很简单的总结出堆和栈的区别:

1、应用程序所有的部分都使用堆内存,然后栈内存通过一个线程运行来使用。

2、不论对象什么时候创建,他都会存储在堆内存中,栈内存包含它的引用。栈内存只包含原始值变量好和堆中对象变量的引用。

3、存储在堆中的对象是全局可以被访问的,然而栈内存不能被其他线程所访问。

4、栈中的内存管理使用LIFO的方式完成,而堆内存的管理要更复杂了,因为它是全局被访问的。堆内存被分为,年轻一代,老一代等等,更多的细节请看,这篇文章

5、栈内存是生命周期很短的,然而堆内存的生命周期从程序的运行开始到运行结束。

6、我们可以使用-Xms和-Xmx JVM选项定义开始的大小和堆内存的最大值,我们可以使用-Xss定义栈的大小

7、当栈内存满的时候,Java抛出java.lang.StackOverFlowError异常而堆内存满的时候抛出java.lang.OutOfMemoryError: Java Heap Space错误

8、和堆内存比,栈内存要小的多,因为明确使用了内存分配规则(LIFO),和堆内存相比栈内存非常快。

 

2.成员变量调用前可以不用初始化,变量创建后有默认初始值成员变量:有默认初始化值

局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。

--------------------- 

作者:www.kingyase.com 

来源:CSDN 

原文:https://blog.csdn.net/weixin_42206151/article/details/84781368 

版权声明:本文为博主原创文章,转载请附上博文链接!

分享到:
评论

相关推荐

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    Java成员变量局部变量静态变量成员方法全局方法等概念的区别共3页.pdf.zip

    成员变量和局部变量

    在类中的位置不同 成员变量:在类中方法外 局部变量:在方法内或者方法声明处 在内存中的位置不同 成员变量:在堆内存中 局部变量:在栈内存中 ... 成员变量和局部变量的名称可以一致,方法调用的时候采取就近原则

    Java实例变量、类变量、局部变量

    类变量是类中的静态变量,是用static修饰的变量;实例变量就是类中的成员变量,没有用static修饰的。 类变量是所有对象公用的,实例变量是对象私有的;当一个对象将类变量进行修改...局部变量,即定义在方法内部的变量。

    JAVA 面向对象程序设计第2章 面向对象进阶.pptx

    2.1.1 成员变量与局部变量的区别;2.1.2 成员变量的使用;2.1.2 成员变量的使用;2.1.3 学生实践练习;2.1.3 学生实践练习;2.2 this关键字;2.2 this关键字;2.2.1 使用this关键字引用成员变量和成员方法;2.2.2 解决实例...

    Java岗面试核心MCA版

    成员变量与局部变量的区别有哪些 变量:在程序执行的过程中,在某个范围内其值可以发生改变的量。从本质上 讲,变量其实是内存中的 一小块区域 成员变量:方法外部,类内部定义的变量 局部变量:类的方法中的变量。 ...

    面向对象知识点.txt

    类的方法: public 方法返回值的数据类型 方法名(){ //方法的主体 }————成员变量和局部变量———— 成员变量(属性)和局部变量的区别:1.作用域不同; 2.初始值不同 (1 * 局:定义它的方法内;成:定义它的...

    Java中this与super的区别

    Java中this与super的区别 this&super; 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。 Java关键字this只能用于方法的方法体内。当一个对象创建后, Java虚拟机(JVM)就...

    Java练习二.docx

    Java练习二.docx

    Java开发技术大全(500个源代码).

    localVSmember.java 局部变量与成员变量同名问题示例 onlyTest.java 对象传值示例 otherClass.java 从类的外部访问对象的成员 showInstVar.java 演示不同的对象拥有不同的成员变量 showMain.java 演示main方法...

    实验三:Java类与对象

    本次实验进一步学习了Java的相关知识,深入理解了面向过程与面向对象语言的区别,了解了面向对象语言的三大特征,掌握类的声明和构造方法,掌握了对象的创建方法与创建机制,掌握了成员变量、类变量和局部变量区别,...

    Java 毕业论文:俄罗斯方块游戏设计源码资料.rar

    Java 毕业论文:俄罗斯方块游戏设计源码资料,学习了俄罗斯方块中的人工智能技术,按照面向对象的软件工程设计方法,分析俄罗斯方块游戏中出现的每一个类,指出类名及其功能,并指出类中的成员变量和成员函数。成员...

    【Java语言基础】final关键字

    final修饰变量时,表示该变量一旦获得了初始值之后就不可被改变,final既可修饰成员变量(包括类变量和实例变量),也可以修饰局部变量,形参。 final修饰成员变量 类变量:当类初始化时,系统会为类变量分配内存,...

    FunFacts:这个 Android 入门项目演示了用于创建文本字段、按钮、toast、简单 if-else、类用法、数组、onclicklistener、成员变量和局部变量之间的区别与使用“final”声明有关的方法局部变量。 有许多行注释掉的代码有意留在 .java 文件中。 它们提醒人们有多种编写代码的方式

    有趣的事实这个 Android 入门项目演示了用于创建文本字段、按钮、toast、简单 if-else、类用法、数组、onclicklistener、成员变量和局部变量之间的区别与使用“final”声明有关的方法局部变量。 有许多行注释掉的...

    JAVA基础(二)String/StringBuffer/StringBuilder/成员变量和局部变量/对象实体和对象引用

    1. JAVA面向对象编程三大特征...多态:程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,在程序运行期间才确定。 两种方式:1.继承——多个子类对同一方法的重写;2.接口——实现

    java 面对对象编程.pdf.zip

    成员变量与局部变量的区别 创建一个对象用什么运算符?对象实体与对象引用有何不同? 对象的相等和引用相等的区别 类的构造方法的作用是什么? 如果一个类没有声明构造方法,该程序能正确执行吗? 构造方法有哪些特点?...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    对象的使用包括引用对象的成员变量和方法,通过运算符·可以实现对变量的访问和方法的调 用,变量和方法可以通过设定一定的访问权限(见下面的例子)来允许或禁止其它对象对它的 访问。 我们先定义一个类 Point。 例子...

    2023最新整理版-java基础面试提

    2023最新整理,java基础面试题,涵盖基础概念与常识、基本语法、基本数据类型、面向对象基础...14. 成员变量与局部变量的区别? 15 13. 静态变量有什么作用? 15 14. 字符型常量和字符串常量的区别? 15 15. 什么是方法

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.8.1 发现问题:当实例变量和局部变量重名 177 7.8.2 经常深藏不露的this关键字 178 7.8.3 在方法中调用方法 179 7.9 构造方法(Constructor) 181 7.9.1 构造(Constructor)方法初探 181 7.9.2 如何使用构造...

    Java2实用教程.rar

    4 2 3成员变量和局部变量 4 2 4方法 4 2 5方法重载 4 2 6构造方法 4 2 7类方法和实例方法 4 2 8值得注意的问题 4 3对象 4 3 1创建对象 4 3 2使用对象 4 3 3于象的引用和实体 4 3 4参数传值 4 4static关键字 4 4 1...

Global site tag (gtag.js) - Google Analytics