当前位置:首页 > 内存 > 正文

jvm内存是什么

  • 内存
  • 2024-06-26 23:32:48
  • 4487

一、jvm堆内存和非堆内存(小白入门文,各博客视频基础总结)

1:堆内存和非堆内存的定义
Java虚拟机有一个堆(Heap),是运行时数据区域,所有类实例和数组的内存都是从这里分配的。。堆栈是在Java虚拟机启动时创建的。在JVM中,非堆内存就变成了非堆内存。
堆内存及相应的垃圾收集算法
1堆的大小可以是固定的,也可以增长和收缩。
2对象创建后进入Eden。新生代分为Eden和Survivor。Survivor由FromSpace和ToSpace组成。Eden区占用的容量较大,Survivor区占用的容量较小。默认比例为8:1:1。
MinorGC:使用复制算法。首先将Eden区和ServvivorFrom区中存活的对象分配到ServivorTo区(如果对象年龄达到老年代标准/ServivorTo位置不够,则复制到老年代),同时将对象的年龄+1,然后清除Eden和ServivorFrom中的对象。然后交换ServivorTo和ServivorFrom。
3老年代
老年代存储的是生命周期较长的内存对象。
老年代对象相对稳定,不会经常发生GC。在MajorGC之前,通常会先执行MinorGC,这样新生代中的对象就会进入老年代,并且只有在空间不足时才被激活。当找不到足够大的连续空间来分配给新对象时,MajorGC将抢先激活垃圾收集。
MajorGC:如果使用CMS收集器,请使用令牌删除算法。首先扫描老年代,标记所有可回收的对象,标记完成后,所有标记的对象都会被统一回收。与此同时,中断的内存碎片也会被创建。过多的碎片会导致程序以后需要分配更大的对象时无法找到足够的连续内存,GC就不得不重新开始。否则,使用品牌压缩算法。
压标:对可回收的物体进行标记后,将不可回收的物体移至一端,然后清除标记的物体。
当老年代已满而无法加载时,会抛出OOM异常。
二:永久代
永久内存区域主要存储Class和Meta(元数据)信息Class在加载时就被放置在永久区域中。与实例存储区域不同,GC在主程序执行过程中不会清除永久区域。因此,随着更多类的加载,它可能会导致永久生成区域被填满,从而引发OOM。
在Java8中,永久代已被删除,并被一个称为“元数据区域”(metaspace)的区域所取代。
元空间的本质和永久代类似,都是JVM方法区的实现。然而,元空间使用本地内存,永久代位于JVM虚拟机中。因此,默认情况下,元空间大小受本地内存限制。类元数据放置在本机内存中,字符串常量和静态类变量的数组放置在Java堆上。这样,有关可以加载多少个类的元数据不再受MaxPermSize控制。当前可用的系统空间。
1Metaspace解决了永久代OOM问题。
难以确定类型2方法信息的大小等。很难指定永久溢出代和大型老年代的大小。
3永久代会给GC带来不必要的复杂性,回收效率低。
三:调整堆内存参数
1.-Xms设置分配内存初始大小,默认物理内存1/64
2.-Xmx设置最大分配内存,默认物理内存为1/4longmaxMemory=time().maxMemory();longtotalMemory=time().totalMemory();n("分配的最大内存"+maxMemory/(double)1024/1024+"MB"+maxMemory/(double)1024/1024/1024+"GB");n("默认分配内存"+totalMemory/(double)1024/1024+"MB"+总内存/(双)1024/1024/1024+"GB");

上一篇:jvm内存是什么意思

下一篇:jvm内存分配