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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luo4105/article/details/82532110

堆栈数据结构

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

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

堆栈

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

推荐阅读

1.堆树详解及使用最大堆实现优先队列

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。

猜你喜欢

转载自blog.csdn.net/luo4105/article/details/82532110
今日推荐