为什么80%的码农都做不了架构师?>>>   

在java语言的学习和使用当中你可能已经了解或者知道堆和栈,但是你可能没有完全的理解它们。今天我们就一起来学习堆、栈的特点以及它们的区别。认识了这个之后,你可能对java有更深的理解。

Java堆内存(Heap Memory)

堆内存在Java运行时主要去回收对象和JRE的类。当我们创建了一个对象(也就是 new一个对象),在堆内存就会为对象分配一个空间,Java垃圾回收器(GC)运行在堆内存里,一旦发现没有任何地方引用到这个对象,就释放这个对象所占的内存。
被创建的对象存在于堆内存,并且拥有全局权限,能被应用的任何地方引用到。

Java栈内存(Stack Memory)

堆内存是单线程执行的,它的空间比堆内存空间要小。它里面会包括定义在方法里的、短时间存在的局部变量,这些局部变量总是引用到堆内存的对象。堆内存还有个特点就是后进先出。当一个方法被调用之后,在栈内存就会为这个方法产生一个内存区域来保存方法里的基本数据类型数据和引用了堆内存中对象的局部变量。当这个方法执行完毕,这个块没有用了,就会被垃圾回收器回收,接着继续下一个方法。

加深理解

先来看一段简单的代码

public class TestMemory {public static void main(String[] args) {int i = 666;//line1Object object = new Object();//line2TestMemory testMemory = new TestMemory();//line3testMemory.test(object);//line4}
//line5private void test(Object params){//line6String str = params.toString();//line7System.out.println(str);//line8}
}
//line9

下面这张图片展示了上面代码的内存信息。

1、当程序运行时,JVM会先加载运行时的类和我们自己写的类信息,这些类信息加载后存在堆内存当中。

2、接着进入到main方法,第一行line1创建了一个基本数据类型i=666,所以创建了一个main方法的内存块,它里面同时存放了i=666;

3、接着line2和line3的位置
Object object = new Object();
TestMemory testMemory = new TestMemory();创建了两个局部变量,object和testMemory,同时在堆里存放了两个新的对象Object和TestMemory。(每次我们new 一个对象都会在堆区产生一块内存区给它分配空间)。同时object和testMemory引用了new出来的对象。

4、现在到了line4,test方法了,当调用到test方法的时候,在栈的顶层创建了一块test()方法的内存区(我们说过栈的特点就是后进先出),由于在 Java里的传递是值传递,所以就有了参数object产生了一个新的引用。

5、最后调用了toString产生了一个字符串常量存放在了String pool里,并且str 引用了它。(如果你有String类感兴趣,你可能喜欢 》 Java你可能不知道的事系列1_String类

6、当test方法结束,它里面的变量也就被GC回收掉了。接着main方法也就结束。Java在运行时释放这些内存并结束程序的运行。

总结

1、当一个对象被创建,总是会在堆内存为它分配空间并且存储,如果有赋值就会将变量引用到对象。而栈内存就是存放这些引用对象的局部变量。

2、栈内存的生命周期很短,而堆内存从程序执行开始到结束一只都需要工作。因为栈内存没当执行完一个方法,它们所占的内存区就会被释放。而堆内存里的对象只有在没有任何变量引用到它的时候才可能会被释放。

3、栈内存大小相比于堆内存非常小。但是它相对于堆内存又比较快。

转载于:https://my.oschina.net/313155/blog/637706

java你可能不知道的事(2)--堆和栈相关推荐

  1. ES6 你可能不知道的事 – 基础篇

    ES6 你可能不知道的事 – 基础篇 转载 作者:淘宝前端团队(FED)- 化辰 链接:taobaofed.org/blog/2016/07/22/es6-basics/ 序 ES6,或许应该叫 ES ...

  2. 祝贺!屠呦呦再获国际大奖!一文读懂:神药青蒿素那些我们不知道的事

    又有好消息传来!总部位于法国巴黎的联合国教科文组织10月22日公布2019年度联合国教科文组织-赤道几内亚国际生命科学研究奖获奖名单,共3人获奖,其中包括来自中国的屠呦呦. 此前,屠呦呦先后拿下多项大 ...

  3. 魂斗罗java设计,你所不知道的《魂斗罗》 设计企划书告诉你神作如何炼成

    你所不知道的<魂斗罗> 设计企划书告诉你神作如何炼成 2016-08-09 18:07:59来源:游戏下载编辑:评论(0) 很多人对电子游戏最初的记忆里都不会少了<魂斗罗>,但 ...

  4. 吃人的那些 Java 名词:对象、引用、堆、栈

    作为一个有着 8 年 Java 编程经验的 IT 老兵,说起来很惭愧,我被 Java 当中的四五个名词一直困扰着:对象.引用.堆.栈.堆栈(栈可同堆栈,因此是四个名词,也是五个名词).每次我看到这几个 ...

  5. 我不知道的事——深克隆和浅克隆

    推荐一部好电影<致命魔术>.(此处为植入广告)        推荐理由:涉及人性.画面不错,剧情跌宕,亦魔亦幻(此处的"魔"为魔术的"魔").虽然女 ...

  6. 关于线程池,那些你还不知道的事

    本文转载于:https://www.cnblogs.com/hafiz/p/7589352.html#4010404 一.背景 最近在学习线程相关的知识,然后顺理成章少不了学习线程池,刚开始在没有深入 ...

  7. 跨性别,你所不知道的事

    今晚原计划在订阅号里推送南溪妹子前几天录制的跨性别科普视频,没想到今天收到南溪的私信,说不做科普了,还是算了吧.急忙去了解了一下原因 (http://www.zhihu.com/pin/9631015 ...

  8. 补充小程序的一些观点,以及你可能还不知道的事(内附最全小程序名单、小程序商店)...

    微信小程序 注:此文部分内容引自网络观点,其他为原创. 文 / IDO老徐 & 网络 从昨晚(1月9日)凌晨开始,老徐的朋友圈就被小程序各种刷屏,各新媒体小编那真是一个拼命啊,凌晨1点就已经能 ...

  9. 自动化测试 | 如何选择半导体测试系统——你不得不知道的事

    半导体产品 半导体产品,又被称为集成电路或者IC,英文名是Semiconductor Device.在半导体测试中常用DUT(Device Under Test)来表示需要检测的IC单元.半导体测试的 ...

最新文章

  1. 还在用JDK6的同学,来看看JDK13新特性详解吧
  2. HTML5调用本地摄像头画面,拍照,上传服务器
  3. Android技术点增长 - 收藏集 - 掘金
  4. linux splash qt,ubuntu14.04 splash安装
  5. oracle sequrnce_OracleSql语句学习(五)
  6. React开发(262):react中活动时间回显用moment
  7. c语言学生对老师的评教系统,学生对老师的评价
  8. Shopify:管理一个顶级域名绑定shopify网店
  9. 阿帕奇服务器文件上传,Apache HttpCore4.4基于经典的IO实现HTTP文件传输服务器
  10. 罗永浩宣布要做带货一哥后,合作单子如雪花般飞来
  11. ubuntu 重装 nvidia_时隔三个月 NVIDIA为何再次打破AI推理性能记录
  12. 3des base64 java_java和c++中的DES\3DES\Base64
  13. 免费下载380套大型商业源码
  14. 已解决-Windows10没有windows照片查看器-Windows10打开照片是黑底的
  15. 培养创造性思维的20个方法
  16. jacobi方法 matlab,Jacobi(雅可比)迭代原理与matlab代码
  17. 视频变声用的什么软件?来看看今天的分享
  18. python随机生成英文字符串_如何用Python语言生成随机字符串 | 学步园
  19. 基于SpringBoot+Vue的前后端分离开发汽车之家资讯论坛系统设计与实现
  20. 奸商如何修改电脑属性里显示的CPU型号和内存容量

热门文章

  1. 软件设计师--文件索引
  2. erlang安装_RabbitMQ的使用(一)- RabbitMQ服务安装
  3. java frame清除控件_java – 清除JFrame的组件并添加新组件
  4. java system.out.read_一个java文件操作小程序 system.out.in buffer read
  5. php订阅号借权,php订阅号借权
  6. 教你正确把加减乘除运用在MySQL里面
  7. java通过url读取网络图片
  8. 中国企业海外人才发展白皮书
  9. MySQL下载和安装以及问题解决
  10. tpch测试mysql_MySQL-tpch 测试工具简要手册