java虚拟机之Java堆、方法区

6 篇文章 0 订阅
java堆与方法区,两者都是线程共享的。

1.java堆

对于java应用程序来说,java堆是java虚拟机所管理中内存最大的一块。java堆是被所有线程(可以理解成一个独立运行代码的空间)共享的我一个区域,在java虚拟机启动时创建。java几乎所有的实例对象都存储在java堆中。这里为什么不说所有对象都存放到对中呢?因为现在出现一些即时编译技术的进步,例如逃逸技术,栈上分配、标量替换优化等手段已经导致一些微妙的变化,所以说所有的实例对象都放在堆是没那么绝对的。而且在《java虚拟机规范》中,隐约感觉到其在前面加了不少定语。
CG堆
java堆是垃圾回收器管理的内存对象,所以java堆也被成为GC堆。由于当今的垃圾回收器大部分都是基于分代理论进行设计的,所以我们会在网上教程经常会听到java堆分为新生代、老年代和永久代等。
而新生代分为eden区、SurvivorFrom区和SurvivorTo区,堆的结构图如下图所示:
在这里插入图片描述
从分配内存的角度来看,所有的线程共享java堆中可以划分为出多个线程私有的分配缓冲区,已提升对象的分配时的效率。不过无论从什么角度来看,怎么划分,都不会改变java堆中存储内容的共性。java堆的细分目的只是为了更好地进行内存的回收。
java堆可以处于物理上的不连续的内存空间中,但是逻辑上它应该被视为连续的,这点就像用磁盘空间存储文件一样,并不要求每个文件都连续存放。但是大对象,如数组等,多数虚拟机实现处于简单、存储高效的考虑,很可能会要求连续的内存空间。java堆的内存可以是固定的,也可以是可扩展的。

2.方法区

方法区和java堆一样,是所有线程共享的。原因应该很简单,因为线程运行的地方为java栈,虚拟机栈可以在java堆和方法区开辟空间,并引用其内存空间中存储的数据。而方法区主要存储哪些类型的数据呢?
方法区主要用于存储已经被虚拟机加载的类型信息、常量、静态变量、及时编译后的代码缓存等数据。方法区还有另外一个别名,叫做“非堆”,为了与java堆做出区别,那么java堆中的永久代与方法区有哪些区别呢?
方法区与永久代,并非等价的。起初,HotSpot虚拟机设计团队选择把收集器的分代设计扩展到方法区了,或者说使用永久代来实现方法区,这样使得HotSpot的垃圾收集器能够像管理管理java堆一样管理这部分内存,省得专门为方法区编写内存管理代码。
如今想想看,使用永久代充当方法区并不是一个好主意,这种设计容易导致java应用更容易遇到溢出问题。

结束语

后续会更上一些,运行时常量池、直接内存等内容,继续献丑了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值