堆,栈,方法区

堆,栈,方法区?我们统称它们为对象内存管理

对象的内存管理:在JAVA语言中,我们编译好的Java程序无论是代码还是数据,都需要存储在内存当中,需要运行在JVM中,所以说JVM为Java程序提供并管理了所需要的内存空间。JVM把内存空间分为“堆”、“栈”、“方法区”三个区域,分别用于存储不同的数据。下面我们就分别来了解一下这三个存储空间的知识点。

我们在程序编写过程中,会用到new关键字去创建一个对象,那么创建了对象之后JVM会在其内存空间开辟出一个存储空间,我们称为“堆”。
在这里插入图片描述

成员变量的声明周期

程序在访问对象时要依靠引用变量。当一个对象没有任何引用时,被称为废弃的对象,属于被回收的范围,该对象中的所有成员变量也随之被收回。那么成员变量的生命周期即为:从对象在堆中创建开始到对象从堆中被回收结束。

Student s=new Student();

s=null; //不再指向刚分配的对象空间,成员变量失效

当一个对象没有任何引用时(即放弃的对象),就被列入被回收的范围,如何回收?在JVM中引入了垃圾回收机制:垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象。

Java程序员不用担心内存管理,因为垃圾收集器会自动进行回收管理。

Java程序的内存泄露问题

内存泄露是指,不再使用的内存没有被及时回收,严重的内存泄露会因过多的内存占用而导致程序的崩溃。GC线程判断对象是否可以回收的依据是该对象是否有引用指向,因此,当确定该对象不再使用时,应该及时将其引用设置为null。

GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象,就立刻回收,一般情况下,当我们需要GC线程即刻回收无用对象时,可以调用System.gc()方法,该方法用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统。

非堆——栈

JVM在其内存空间开辟了一个称为“栈”的存储空间,用于存放方法的局部变量;这部分空间用于存储程序运行时在方法中声明的所有局部变量,如下图

在这里插入图片描述

一个运行的Java程序从开始到结束会有很多次方法的调用,JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧。

一个栈帧对应一个正在调用中的方法,栈帧中存储了该方法的参数、局部变量等数据。当某一个方法调用完成后,其对应的栈帧将被清楚,局部变量失效。

成员变量和局部变量的比较

局部变量:

-定义在方法中

-没有默认值,必须自行设定初始值

-方法被调用时,存在栈中,方法调用结束,从栈中清除

成员变量:

-定义在类中,方法外

-有默认初始值,可以不显示初始化

-所在类被实例化后,存在堆中,对象被回收时,成员变量失效

非堆——方法区

方法区用于存放类的信息,Java程序运行时,首先会通过类装载器载入类文件的字节码信息,经过解析后将其装入方法区。类的各种信息(包括方法)都在方法区存储。
在这里插入图片描述

当类的信息被加载到方法区时,除了类的类型信息以外,同时类内的方法定义也被加载到方法区;类在实例化对象时,多个对象会拥有各自在堆中的空间,但所有实例对象是共用在方法区中的一份方法定义的。

JFrame f1=new JFrame();

JFrame f2=new JFrame();

f1.setSize(200,300);

f2.setSize(300,400);

setSize方法只有一份,分别针对f1指向的对象和f2指向的对象调用了2次。

再来看一个例子
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值