JVM学习04:运行时数据区域-JAVA堆

10 篇文章 3 订阅
9 篇文章 0 订阅

这里写图片描述
这里写图片描述
The heap is the runtime data area from which memory for all class instances and arrays is allocated。

  1. Java heap是Java虚拟机中内存最大一块区域,也是最该小心的区域,因为内存溢出一般都在这块区域发生。
  2. Java heap是被线程共享的内存区域,在虚拟机启动的时候创建。
  3. 该区域存储的是实例化对象和数组的真实地址,由于线程共享所以在共享是该区域的对象时需要注意同步
  4. 注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。方法的调用是由java栈中的栈帧来完成入栈出栈的使用,Java对象中包含的基本数据由他所属的类及其所有超类声明的实例变量组成。只要有一个对象引用,虚拟机就必须能够快速的定位对象实例的数据。另外,它也必须能通过该对象引用访问相应的类数据(存储于方法区的类型信息)。因此在对象中通常会有一个指向方法区的指针。
  5. Java虚拟机有一条在堆中分配对象的指令,却没有回收该对象的指令。由于对象的频繁创建,会导致java heap区域内存逐渐缩小,对于不在被使用的对象会大大浪费内存空间,因此Java虚拟机中引入了垃圾回收。Java heap是垃圾回收器的主要战场。
  6. 根据Java虚拟机规范,java heap可以处于物理地址不连续的内存空间中,只要在逻辑地址中保持连续即可,就像磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的。(通过-Xmx和-Xms控制
  7. 如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常
  8. 由于现在收集器基本采用分代收集算法,所以JAVA堆还可以细分为:新生代和老年代,再细分还有Eden空间、From Survivor空间、To Survivor空间。 其主要思想与Java GC有关系,即大部分对象的存活时间都比较短,如果某一个对象存活时间比较长,就把他移到另外一个区域。这样做GC的成本比较低。(后续的文章中会重点讲述该区域的分配与回收

    其他说明
    其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,默认为操作系统物理内存的1/64但小于1G,-Xmx为JVM可申请的最大内存,默认为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过XX:MaxHeapFreeRation=来指定这个比列,对于运行系统,为避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。
    由于现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代主要存储新创建的对象和尚未进入老年代的对象。老年代存储经过多次新生代GC(Minor GC)任然存活的对象。
    新生代:
    程序新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及Survivor Space的大小。
    老年代:
    用于存放经过多次新生代GC任然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:①.大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。②.大的数组对象,切数组中无引用外部对象。
    老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。
    这里写图片描述
    这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值