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

jvm堆外内存查看工具(jvm查看堆内存使用情况)

  • 内存
  • 2024-05-18 08:06:02
  • 369

一、怎么查看GC及jvm配置JVisualVM是JDK6update7之后发布的工具,基于该工具可以检查程序中的内存消耗、内核执行状态以及CPU和内存消耗行为。
二、jvm堆内存和非堆内存(小白入门文,各博客视频基础总结)

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