一、栈

栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈数据可以共享。

那些数据存放在栈中?

基本数据类型(int, short, long, byte, float, double, boolean, char)的变量存放于栈中。

对象的引用存放于栈中。

栈数据共享具体指什么意思?(方法区中的常量池)

int a = 3; int b = 3; 
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。即共享了3这个栈数据。

另外,比较特殊的是String,虽然String类型不是简单的基本数据类型,但是当用String a="abc"这样的语法定义String变量的时候,会把数据存储在栈中,因此也会有上面所说的数据共享特性。

java的八种基本类型(Byte Short、Integer、Long、Character、Boolean、Float、Double),除Float及Double意外,其它六种都实现了常量池,但是他们只在大于等于-128且小于等于127时才能使用常量池,如果不在此范围内,则会new一个出来,保存在堆内存中。

二、堆

堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器。堆数据在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

那些数据存放在堆中?

堆内存用于存放由new创建的对象和数组,即堆主要是用来存储对象的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。

三、方法区中的静态存储区

存储static声明的静态变量

最新文章

  1. RabbitMQ - 引入库产生的一次pthread_create错误
  2. [OJ] Search for a Range
  3. [RxJS] Reactive Programming - Why choose RxJS?
  4. 关于 linux ssh 的配置.
  5. 在WPF中自定义你的绘制(三)
  6. Javascript学习8 - 脚本化文档(Document对象)
  7. java 执行redis的部分方法
  8. NPIO 导出Execl
  9. Latex居中
  10. maven包加载
  11. tomcat报异常Invalid character found in method name. HTTP method names must be tokens
  12. 【vue】vue-router路径无法正确跳转
  13. SharePoint 2013: Workflow Manager Backend 服务意外地终止
  14. PHP-X介绍
  15. kvm/qemu虚拟机桥接网络创建与配置
  16. 【数据库】MFC ODBC(一)
  17. 如何快速配好java环境变量和查看电脑上安装JDK的版本位数
  18. TensorFlow Python2.7环境下的源码编译(二)安装配置
  19. python 例程的一个好例子
  20. pandas--对axis=0,axis=1的理解

热门文章

  1. 压力单位MPa、Psi和bar之间换算公式
  2. VRP相关知识整理
  3. android Button 切换背景,实现动态按钮和按钮颜色渐变
  4. Koa2 源码解析(1)
  5. 实验-hadoop开发环境部署
  6. tornado简单的验证码
  7. css笔记16:盒子模型的入门案例
  8. 网站安全通用防护代码(C#版本源码提供)
  9. HDU 3335 Divisibility (DLX)
  10. makefile中使用变量