Java对象创建内存案例解析

Java对象创建内存图解析

1. 栈

  • Java栈的区域很小 , 特点是存取的速度特别快,栈存储的特点是, 先进后出,存储速度快的原因: 栈内存, 通过 栈指针'来创建空间与释放空间,指针向下移动, 会创建新的内存, 向上移动, 会释放这些内存。这种方式速度特别快 , 仅次于PC寄存器,但是这种移动的方式, 必须要明确移动的大小与范围 ,明确大小与范围是为了方便指针的移动 , 这是一个对于数据存储的限制, 存储的数据大小是固定的 , 影响了程序的灵活性。 所以我们把更大部分的数据 存储到了堆内存中存储的是:基本数据类型的数据 以及 引用数据类型的引用。

例如:
int a =10;
Person p = new Person();
10存储在栈内存中 , 第二句代码创建的对象的引用§存在栈内存中

2. 堆

  • 堆存放的是类的对象 ,Java是一个纯面向对象语言, 限制了对象的创建方式:所有类的对象都是通过new关键字创建new关键字, 是指告诉JVM, 需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间,堆内存与栈内存不同, 优点在于我们创建对象时 , 不必关注堆内存中需要开辟多少存储空间 , 也不需要关注内存占用时长,堆内存中内存的释放是由GC(垃圾回收器)完成的垃圾回收器 回收堆内存的规则:当栈内存中不存在此对象的引用时,则视其为垃圾 , 等待垃圾回收器回收 。

3. 方法区

方法区存放的是:

  • 类信息
  • 静态的变量
  • 常量
  • 成员方法
    方法区中包含了一个特殊的区域 ( 常量池 )(存储的是使用static修饰的成员)

创建内存栈、堆、方法区图析

举个例子如下图:

Java对象创建内存案例解析_第1张图片

对象的引用存放在栈中,new创建Book()对象在堆内存中开辟了一段内存,内存都是有地址的假设为0x123,栈内存中存储了地址,地址指向堆内存,获取了对象Book的属性name、info,并赋值为"计算机",“计算机书籍”,如图示:

Java对象创建内存案例解析_第2张图片

接着BOOK book2 = book1,在栈内存中又创建了一个区域,这个区域就是book2,也拿到book1的地址,通过book2调用将name改为"Java",接着在调用方放say()。整个过程如图示:

Java对象创建内存案例解析_第3张图片

结果如下:

Java对象创建内存案例解析_第4张图片

  • 方法结束整个过程完成后,变量对象使用完毕,因为它的作用域就这么大,将会被释放,book2,book1先后出栈释放,紧接着堆内存的对象没有任何栈内存指向它,最后交给交给GC垃圾回收期处理。

这就是Java对象创建内存到释放内存的一个过程。

到此这篇关于Java对象创建内存案例解析的文章就介绍到这了,更多相关Java对象创建内存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(Java对象创建内存案例解析)