JAVA中的堆、栈等内存分析
在 JAVA 中,有六个不同的地方可以存储数据
1. 寄存器( register )
这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
2. 栈( stack )
位于通用 RAM 中,但通过它的“栈指针”可以从处理器获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,存取仅次于寄存器。创建程序时候, JAVA 编译器必须知道存储在栈内所有数据的确切大小和生命周期,因为它必须生成相应的内存空间,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些 JAVA 数据存储在栈中——特别是对象引用,但是 JAVA 对象不存储其中。
3. 堆( heap )
一种通用性的内存池(也存在于 RAM 中),用于存放所有的 JAVA 对象。堆不同于栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要 new 写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代价:用堆进行存储分配比用堆栈进行存储存储需要更多的时间。
4. 静态存储( static storage )
这里的“静态”是指“在固定的位置”(尽管也位于RAM)。静态存储里存放程序运行时一直存在的数据。你可用关键字 static 来标识一个对象的特定元素是静态的,但 JAVA 对象本身从来不会存放在静态存储空间里。
5. 常量存储( constant storage )
常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割开,所以在这种情况下,可以选择将其放在 ROM 中。(这点的一个例子便是字符串常量池,所有字面字符串和字符串常量表达式都被自动intered从而被放到一个特殊的静态存储空间里)
6. 非 RAM 存储
如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在
最新文章
- PAT 1044. 火星数字(20)
- C语言回顾-内存管理和指针函数
- dp 动态规划 hdu 1003 1087
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- 转:openwrt中luci学习笔记
- linux内核源码结构
- 访问MySQL数据库时,报“找不到请求的 .net Framework 数据提供程序。可能没有安装。”的解决方案
- HTML5-svg圆形饼状图进度条实现原理
- Linux系统——MHA-Atlas-MySQL高可用集群
- postgresql 随机函数
- Python -- 连接数据库SqlServer
- luogu P4051 [JSOI2007]字符加密
- Beginning SDL 2.0(6) 音频渲染及wav播放
- Valgrind memcheck 8种错误实例
- 什么是ASCII码文本文件
- s3c2440存储控制器详解
- 半小时分组统计个数sql
- bzoj 1818 主席树
- python调用虹软2.0第二版
- Bootstrap学习笔记面板(Panels)
热门文章
- Zabbix学习之路(二)之添加主机监控及自定义item监控
- ELKStack入门篇(四)之Filebeat
- 【RAC搭建报错】libcap.so.1:cannot open shared object file
- 自己动手做AI:Google AIY开发工具包解析
- NUMA 体系架构
- 【转】SWFUpload 官方说明文档(2.5.0版)
- ADAS芯片解决方案汇总
- 20181023-4 Beta阶段第1周/共2周 Scrum立会报告+燃尽图 01
- vim 编码方式的设置
- 按Right-BICEP要求的对任务二的测试用例