博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM(2)之 JAVA堆
阅读量:5969 次
发布时间:2019-06-19

本文共 833 字,大约阅读时间需要 2 分钟。

  hot3.png

之前我们说到了栈,它在内存中是连续的空间;保存一个个的栈帧,对应一次次方法的调用;还讲到了他是保存对象的引用,那么对象存在哪里呢?我们来看看昨天的一张图: 

这里写图片描述 
  对象就存在图中的内存区域,在JVM中,那片区域叫做堆! 
  由图中可以看到堆的存储结构和栈是不同的,堆在内存中并不是一块连续的区域,他是分散的(物理上是分散,但逻辑上是连续的,大家好好体会一下);虚拟机通过栈中引用的指引在堆中找到所需要的对象。 
  在虚拟机遇到一条new的指令的时候,经过一系列的操作过后(现在讲的话会看不懂)虚拟机就要为该新生对象分配内存空间了,那么问题来了,这么散,虚拟机要怎么知道如何分配呢?分配的方式有两种:指针碰撞和空闲列表。 
  指针碰撞是将内存逻辑上分为两边,一边是空闲的,一边是在用的,指针指向分界点,当需要分配内存的时候只要移动指针即可。但这种只适用于内存规整的情况下,也就是刚刚说的分两边。一般用在Serial,PaeNew等垃圾收集器中,也就是堆中的新生代中。(最后一句话会在后面分几章讲,道路遥远着!) 
  那么空闲列表说的就是在内存不是规整的情况下,虚拟机必须维护一个列表,用于记录哪些内存是可用的,在需要进行分配的时候就从列表中找到一块足够大小的空间进行分配,并且更新列表。又要讲一句看不懂的话:该方法适用于像CMS这种基于Mark-Sweep的垃圾收集器,适用于堆中的年老区! 
  上两段都提到了垃圾收集器,也就是GC。写过java的都知道,java程序很少需要我们去自己释放资源,原因就是这个GC机制了。 
好啦,今天就不多说啦,好好理解一下上文,只要知道一下几点就OK啦!

  • 存放new创建的对象和数组;
  • 在运行时动态分配内存(比如 new()),较慢,但灵活;
  • 是不连续的内存区域,在发出申请的时候,会干嘛干嘛的。。。。
  • 由Java虚拟机的自动垃圾回收器来管理。

转载于:https://my.oschina.net/itommy/blog/1575677

你可能感兴趣的文章
A-Frame.js 学习&文档翻译(一)实体
查看>>
微服务是否使SOA变得无关紧要?
查看>>
新项目配置
查看>>
移动端h5开发总结不断更新中....
查看>>
[elixir! #0037] Agent 小传
查看>>
koa2源码分析
查看>>
javascript自定义事件原理
查看>>
css 单行文本溢出显示省略号
查看>>
在虚拟机安装OpenSuse Tumbleweed
查看>>
新颖交互形式的H5案例浅析(技术分析)
查看>>
华为敏捷 DevOps 实践:产品经理如何开好敏捷回顾会议
查看>>
记住,永远不要在MySQL中使用“utf8”
查看>>
鸟哥:技术人员如何保持进步
查看>>
OpenAI披露最新研究成果:AI训练如何扩展到更大规模?
查看>>
用Chrome开发者工具调试一切
查看>>
让IE兼容background-size的方法_background-size ie下使用
查看>>
Live回顾 | 松鼠AI智适应教育首席科学家崔炜:人工智能如何变革教育产业
查看>>
中国发布自主开发的域名系统基础软件 “红枫”
查看>>
优秀程序员必须知道的32个算法,提高你的开发效率
查看>>
在WPF中实现平滑滚动
查看>>