前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM从头学(一)—— 堆栈与JVM内存模型

JVM从头学(一)—— 堆栈与JVM内存模型

作者头像
逝兮诚
发布2019-10-30 18:28:57
4700
发布2019-10-30 18:28:57
举报
文章被收录于专栏:代码人生代码人生代码人生

堆栈数据结构

堆的数据结构是一个完全二叉树,一般使用于优先队列。堆分大数堆和小数堆,大数堆是大数在父节点,小数,小数堆是小数在子节点。每次排序后的次数也有限,插入排序的次数是数的层数减一,就是O(log2n),初始化的时间复杂度是O(n),消费最大/最小节点的时间复杂度是O(log2n)。消费父节点的算法是,删掉父节点,用最后一个节点重顶节点做插入算法。

栈是一种数据结构,后进先出。

堆栈

用堆排序的方式的栈。永远出栈顶,也就是永远出最大、最小值。

java内存模型

JVM是java虚拟机。它把内存分为,寄存器,本地方法区,方法区,栈内存,堆内存。

方法区

方法区存的都是程序唯一的,静态的,所有线程共用的对象,如class对象,static对象

栈内存存的是引用,基本类型对象。堆存的是数组和实体对象。栈对象的引用的地址就是堆的地址。栈的生命周期很短,一旦对象离开生命周期,就在栈中清除该数据。堆中的对象没有引用,就会被标记为垃圾对象,等待GC。

----------------------       -------------------
| Integer a = OX2312 |  ---> | new Integet(18) |
----------------------       | 地址:OX2312      |
      栈                     --------------------

注意,字符串存在字符串池中,不是栈,也不在堆,在方法区,即使字符串池中的字符串没有引用,也不会GC。

String a = "123";,JVM会在栈中创建引用a,在字符串池中找到是否有”123”这个字符串,如果有,就把地址直接赋予a,如果没有,在字符串池中创建”123”,并把地址赋予a。

String a = new String("123");,JVM会在栈中创建引用a,并比较字符串池中是否存在,不存在便创建,同时在堆中创建一个”123”的对象,把堆的地址赋予引用a。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 堆栈数据结构
  • java内存模型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档