Java内存分配

栈内存

Java中栈是存储方法,本地变量,引用变量的内存。栈总是LIFO。本地变量在栈中创建。

堆内存

Java中堆是存储对象,可能会存储引用变量的内存。实体变量在堆中创建。

Java内存分配

JVM分配内存:

  1. Heap
  2. Stack
  3. Code
  4. Static

内存分配是为了有效管理
code存储字节码
statck存储方法,本地变量,引用变量
heap存储对象,可能也会存储引用变量
static存储静态数据、静态方法

本地变量与实体变量的区别

实体变量声明在类中,但不在方法中

class Student{ 
int num; // num is  instance variable 
public void showData{}

本地方法声明在方法中,也包含方法参数

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

栈与堆的区别

加入你的main方法调用m1

public void m1{
int x=20
}

在Java的栈中,一个frame会被创建
在这里插入图片描述
在m1中的x变量也会再m1的frame中创建
在这里插入图片描述
方法m1调用方法m2,在Java栈中,一个新的frame创建

在这里插入图片描述
在这里插入图片描述
变量b,c也会在新的frame中创建

public void m2(int b){
boolean c;
}

在这里插入图片描述
方法m2调用方法m3,一个新的frame会在Java栈中创建
在这里插入图片描述
在这里插入图片描述
假如方法m3创建一个Account对象,它有两个实体变量p和q。

Account {
 	 Int p;
     Int q;
}
public void m3(){
	Account ref = new Account();
	// more code
}

new Account()声明会在堆中创建一个对象
在这里插入图片描述
一个引用变量也会在Java栈中创建
在这里插入图片描述

=符号将使引用变量指向堆中创建的对象
在这里插入图片描述
只要方法完成执行,那么控制流程会返回到调用的方法,在例子中,就会返回到m2
在这里插入图片描述
在Java栈中的m3方法将会清除
在这里插入图片描述
由于引用变量不再指向堆中的对象,垃圾回收会清除堆中的对象。
在这里插入图片描述
只要方法m2完成执行,也将从栈中移除,它相关的所有变量也会移除,不会再被使用。
最终方法m1也会移除,控制流程会返回到程序的起点,就是main方法。
如果对象中有对其他对象做引用。

public static void main(String args[]) {
  A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d;  //more code }

这种情况下,引用变量child会创建在堆中,它指向对象。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值