Java中的数据存储与内存分配

本文探讨了Java中的数据存储区域,包括寄存器、栈内存、堆内存、常量存储和非RAM存储,并详细解释了内存分配,特别是栈和堆的特点。同时,文章通过一个小问题解释了声明两个int变量并赋值为1时的内存分配情况。
摘要由CSDN通过智能技术生成

Hello Java.

数据存储

  • 寄存器(Register)最快的存储区域,位于CPU内部,按需分配
  • 栈内存(Stack)速度仅次于寄存器,位于常规内存RAM区域,栈指针下移分配内存,上移释放内存;注意,栈内存上存在一些Java数据,例如对象引用,但是Java对象保存在堆内存
  • 堆内存(Heap)通用内存池,位于RAM区域,创建对象时只需用new实例化对象,自动在堆中进行内存分配
  • 常量存储(Constant storage)常量值通常直接放在程序代码中
  • 非RAM存储(Non-RAM storage)数据完全位于程序之外,在程序未运行及脱离程序控制时依然存在,例如序列化对象及持久化对象
  • 参考资料:On Java 8(Java编程思想第5版)

内存分配

  • :函数中定义的基本类型变量和对象的引用变量,栈数据可以共享,但是缺点在于其中的数据大小和生存期必须是确定的,缺乏灵活性
  • :通过new生成的对象存放在堆中,堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理,优点是可以动态分配内存大小,缺点是存取速度慢
  • 方法区:各个线程共享的内存区域,存储二进制class二进制文件,包含了虚拟机加载的类信息、常量(常量池)、静态变量(静态域)、即时编译后的代码等数据
  • 参考资料:Java内存分配总结
  • 参考资料:Java中的内存分配(图解)
  • 参考资料:深入理解Java内存(图解)
  • 参考资料:Java方法区、栈及堆

一个小问题:声明两个int变量并赋值为1时分配了几块内存

int a = 1;
int b = 1;

首先在栈内创建变量a,且int为基本类型,Java自己会在常量池中创建-128到127的常量,变量a中保存指向常量池1的地址;然后在栈内创建变量b,会先查找常量池中是否已经存在1这个常量,如果有就直接在b保存这个地址。因此,是两块内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值