任何语言所编写的程序,其中的各类型的数据都需要一个存储位置,java中书的存储位置分为以下5种:

1、寄存器

最快的存储区,位于处理器内部,但是数量及其有限。所以寄存器根据需求自动分配,无序人为控制。

2、栈内存

位于RAM中,通过堆栈指针可以从处理器中获得直接支持。堆栈指针向下移动,则分配新的内存;向上移动,则释放哪些内存。这种存储方式仅次于寄存器。(常用于存放对象引用和基本数据类型,而不用于存储对象)

3、堆

一种通用的内存池,也位于RAM中。其中存放的数据由JVM自动进行管理。

堆相对于栈的好处来说:编译器不需要知道存储的数据在堆里存活多长。当需要一个对象时,使用new写一行代码,当执行这行代码时,会自动在堆里进行存储分配。同时,因为以上原因,用堆进行数据的存储分配和清理,需要花费更多的时间。

4、常量池

常量(字符串常量和基本类型常量)直接存储在程序内部(常量池)。这样做事安全的,因为它们的值在初始化时就已经被确定,并不会改变,常量池在java泳衣保存在编译已确定的,已编译的class文件中的一份数据。它包括了关于类、方法、接口中的常量,也包括字符串常量,如String s="java"这种生命方式。

5、非RAM存储区

如果数据完全存活于程序之外,那么它可以不受到任何的程序控制,在程序没有运行时也可以存在。其中的两个基本的例子是:流对象和持久化对象

java中数据的存储分为以上5种方式,但是在实际中最常谈起的是:堆内存存储和栈内存存储。

我们可以联系二者来分析这两种不同的存储方式,更利于我们理解:

首先,它们有一定的相同之处:

堆和栈都是用于程序中的数据在RAM(内存)上的存储区域。而且java会自动的管理堆和栈,不需要人为去设置

其次,更关键的在于它们的不同之处:

1、存储数据类型:栈内存中存放局部变量(基本数据类型和对象引用),而堆内存用于存放对象(实体)

2、存储速度:就存储速度而言,堆内存的存储分配和清理速度更快与堆,并且栈内存的存储速度仅次于直接位于处理器中的寄存器

3、灵活性:就灵活性而言,由于栈内存和堆内存的存储机制的不同,堆内存灵活性更优于栈内存。

这两种存储方式的不同之处,也是由于它们自身的存储机制所造成的。所以为了理解它们,首先我们应该弄清楚它们分别的存储原理和机制,在java中:

--栈内存被要求存放在其中的数据的大小,生命周期必须是已经确定的;

--堆内存可以被虚拟机动态的分配内存大小,无序事先告诉编译器的数据的大小、生命周期等相关信息。

接下来便可以进行分析:

栈内存和堆内存的存储数据类型为何不同?

我们知道在java中,变量的类型通常分为:基本数据类型和对象引用变量。

首先,8中基本数据类型中的数字类型实际上都是存储的一组位数(所占bit位)不同的二进制数据;除此之外,布尔型只有true和false两种可能值。

其次,对象引用变量存储,实际上是其所关联(指向)对象在内存中的内存地址,而内存地址实际上也是一串二进制的数据。

所以,局部变量的大小是可以被确定的;

接下来,java中局部变量会在其自身属性方法(或代码块)执行完毕后,被自动释放。

所以局部变量的生命周期也是可以被确定的。

那么,既然局部变量的大小和生命周期都可以被确定,完全符合我们栈内存的存储特点。自然,局部变量被存放在栈内存中

---------------------------------------------------------------------------------------------------------------------------

而java中使用关键字new通过调用类的构造函数,从而得到该类的对象

对象类型数据在程序编译期,并不会在内存中创建和存储工作;而是在程序运行期,才根据需要进行动态的创建和存储

也就是说,在程序运行之前,我们永远不能确定这个对象的内容、大小、声明周期。自然,对象由堆内存进行存储管理。

为什么栈内存的速度高于堆内存?

1、栈中数据一般是基本数据类型和对象引用,实际值基本都是一串二进制数据,数据比较小。而堆数据存放的对象类型数据一般更大。

2、局部变量大小、生命周期确定,堆中的对象不能确定。

3、由于2的原因,栈中的对象可以更方便地进行回收,也就是清理及时。

为什么堆的灵活性要强于栈?

这个比较好理解,就是堆中的数据不确定生命周期和大小所以灵活啊

一个很重要的特点:

栈中存储的数据可以存在数据共享。也就是多个栈中的引用可以指向同一个堆对象

一点补充:

对象 对象名=new 对象。

这种方式实际上是编译阶段执行=前面部分,就是声明对象,然后运行阶段执行后面部分,也就是实例化。String s="ab";和String s=new String("ab");区别就在于此。

java数据的5种存储位置(转)的更多相关文章

  1. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

  2. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  3. (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  4. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览

    Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览   作为一个完成的应用程序,数据存储操作是必不可少的. ...

  5. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  6. docker容器存放目录磁盘空间满了,转移数据修改Docker默认存储位置

    原文:docker容器存放目录磁盘空间满了,转移数据修改Docker默认存储位置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_3767485 ...

  7. Android数据的四种存储方式

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...

  8. Android开发_Android数据的四种存储方式

    Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...

  9. android数据的四种存储方式之一——SharedPreference

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

随机推荐

  1. UVA LIVE-4642 - Malfatti Circles

    给出三角形三个顶点,求出三个互切的圆的半径 尽管大白鼠说能够推出公式,但是这个公式仅仅怕没那么easy推--我左看右看上看下看也推不出. 应该是要做辅助线什么的,那也-- 因为非常easy就推出了关于 ...

  2. Sqlserver 实际开发中表变量的用法

    在实际的开发中,我们可能遇到的问题是,在一个存储过程里面,我们可能要返回多段sql的结果集,但是最终怎么把多个结果集合成一块呢,那么这个时候临时表变量就来了 declare  @tmp table   ...

  3. Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...

  4. rootkit基础

    应用程序总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的.站在黑客的角度讲,如果能 ...

  5. Linux系统运维之路

    九月份开始,半年内搞定运维,博客会慢慢的更新,vim编辑器,Nginx配置文件优化 运维基础 运维基础-Linux发展史.安装.基本操作 运维基础-用户和组管理 运维基础-文件权限管理 运维基础-进程 ...

  6. Spring Boot从入门到实战:整合Web项目常用功能

    在Web应用开发过程中,一般都涵盖一些常用功能的实现,如数据库访问.异常处理.消息队列.缓存服务.OSS服务,以及接口日志配置,接口文档生成等.如果每个项目都来一套,则既费力又难以维护.可以通过Spr ...

  7. php 字符串内容是数组格式 转换成数组

    一个简单的应用.. 例, $str    =    "array( 'USD'=>'1', 'GBP'=>'0.6494', 'EUR'=>'0.7668' ,'JPY'= ...

  8. golang生成随机函数的实现

    golang生成随机数可以使用math/rand包, 示例如下: package main import ( "fmt" "math/rand" ) func ...

  9. 深入Asyncio(十一)优雅地开始与结束

    Startup and Shutdown Graceful 大部分基于asyncio的程序都是需要长期运行.基于网络的应用,处理这种应用的正确开启与关闭存在惊人的复杂性. 开启相对来说更简单点,常规做 ...

  10. Mac Security工具使用总结find-identity

    Security是Mac系统中钥匙串和安全模块的命令行管理工具,(图形化工具为Keychain Access.app).钥匙串(Keychain)实质上就是一个用于存放证书.密钥.密码等安全认证实体的 ...