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保存这个地址。因此,是两块内存。