8.3 方法区 - 设置方法区大小与OOM

本文介绍了JVM内存中方法区的设置及其在不同JDK版本下的变化,包括 PermGen 和 Metaspace 的区别。通过-XX:PermSize和-XX:MaxPermSize(JDK7及以前)或-XX:MetaspaceSize和-XX:MaxMetaspaceSize(JDK8及以上)调整内存大小。当内存溢出时,可能导致OutOfMemoryError。解决OOM异常需要分析内存转储,判断是内存泄漏还是内存溢出,并相应调整代码或内存参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置方法区大小与OOM

设置方法区内存的大小

方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。

jdk7及以前:

  • 通过-XX:PermSize来设置永久代初始分配空间。默认值是20.75M
  • -XX: MaxPermSize来设定永久代最大可分配空间。32位机器默认是64M, 64位机器模式是82M
  • 当JVM加载的类信息容量超过了这个值,会报异常OutOfMemoryError : PermGen space

jdk8及以后:

  • 元数据区大小可以使用参数-XX :MetaspaceSize和-XX:MaxMetaspaceSize指定,替代上述原有的两个参数。
  • 默认值依赖于平台。windows下,-XX:MetaspaceSize是21M, -XX:MaxMetaspaceSize的值是-1, 即没有限制。
  • 与永久代不同,如果不指定大小,默认情况下,虚拟机会耗尽所有的可用系统内存。如果元数据区发生溢出,虚拟机一样会抛出异常OutOfMemoryError: Metaspace
  • -XX:MetaspaceSize: 设置初始的元空间大小。对于一个64位的服务器端JVM来说,其默认的-XX:MetaspaceSize值为21MB。这就是初始的高水位线,一旦触及这个水位线,Full GC将会被触发并卸载没用的类(即这些类对应的类加载器不再存活),然后这个高水位线将会重置。新的高水位线的值取决于GC后释放了多少元空间。如果释放的空间不足,那么在不超过MaxMetaspaceSize时,适当提高该值。如果释放空间过多,则适当降低该值。
  • 如果初始化的高水位线设置过低,上述高水位线调整情况会 发生很多次。通过垃圾回收器的日志可以观察到Full GC多次调用。为了避免频繁地GC,建议将-XX :MetaspaceSize设置为一个相对较高的值。

代码举例1

在这里插入图片描述

代码举例2

在这里插入图片描述

如何解决这些OOM

  1. 要解决OOM异常或heap space的异常,一.般的手段是首先通过内存映像分析工具(如Eclipse Memory Analyzer) 对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow) 。
  2. 如果是内存泄漏,可进一-步通过工具查看泄漏对象到GC Roots 的引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收它们的。掌握了泄漏对象的类型信息,以及GC Roots引用链的信息,就可以比较准确地定位出泄漏代码的位置。
    Roots引用链的信息,就可以比较准确地定位出泄漏代码的位置。
  3. 如果不存在内存泄漏,换句话说就是内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(-Xmx与-Xms) ,与机器物理内存对比看是否还可以调大,从代码上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。
A module that was compiled using NumPy 1.x cannot be run in NumPy 2.1.1 as it may crash. To support both 1.x and 2.x versions of NumPy, modules must be compiled with NumPy 2.0. Some module may need to rebuild instead e.g. with &#39;pybind11>=2.12&#39;. If you are a user of the module, the easiest solution will be to downgrade to &#39;numpy<2&#39; or try to upgrade the affected module. We expect that some modules will need time to support NumPy 2. Traceback (most recent call last): File "F:\ultralytics-8.3.89\train.py", line 1, in <module> from ultralytics import YOLO File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\__init__.py", line 11, in <module> from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\models\__init__.py", line 3, in <module> from .fastsam import FastSAM File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\models\fastsam\model.py", line 5, in <module> from ultralytics.engine.model import Model File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\model.py", line 12, in <module> from ultralytics.engine.results import Results File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\results.py", line 15, in <module> from ultralytics.data.augment import LetterBox File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\data\__init__.py", line 3, in <module> from .base import BaseDataset File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\data\base.py", line 17, in <module> from ultralytics.data.utils import FORMATS_HELP_MSG, HELP_URL, IMG_FORMATS File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\data\utils.py", line 18, in <module> from ultralytics.nn.autobackend import check_class_names File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\nn\autobackend.py", line 54, in <module> class AutoBackend(nn.Module): File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\nn\autobackend.py", line 89, in AutoBackend device=torch.device("cpu"), F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\nn\autobackend.py:89: UserWarning: Failed to initialize NumPy: _ARRAY_API not found (Triggered internally at ..\torch\csrc\utils\tensor_numpy.cpp:84.) device=torch.device("cpu"), New https://pypi.org/project/ultralytics/8.3.165 available 😃 Update with &#39;pip install -U ultralytics&#39; Ultralytics 8.3.89 🚀 Python-3.11.13 torch-2.3.1+cu121 CUDA:0 (NVIDIA GeForce RTX 4080 Laptop GPU, 12282MiB) engine\trainer: task=detect, mode=train, model=yolo11n.pt, data=data.yaml, epochs=200, time=None, patience=100, batch=20, imgsz=640, save=True, save_period=-1, cache=False, device=0, workers=8, project=None, name=train2, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=None, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\train2 Overriding model.yaml nc=80 with nc=1 from n params module arguments 0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2] 1 -1 1 4672 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2] 2 -1 1 6640 ultralytics.nn.modules.block.C3k2 [32, 64, 1, False, 0.25] 3 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2] 4 -1 1 26080 ultralytics.nn.modules.block.C3k2 [64, 128, 1, False, 0.25] 5 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2] 6 -1 1 87040 ultralytics.nn.modules.block.C3k2 [128, 128, 1, True] 7 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2] 8 -1 1 346112 ultralytics.nn.modules.block.C3k2 [256, 256, 1, True] 9 -1 1 164608 ultralytics.nn.modules.block.SPPF [256, 256, 5] 10 -1 1 249728 ultralytics.nn.modules.block.C2PSA [256, 256, 1] 11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, &#39;nearest&#39;] 12 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1] 13 -1 1 111296 ultralytics.nn.modules.block.C3k2 [384, 128, 1, False] 14 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, &#39;nearest&#39;] 15 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1] 16 -1 1 32096 ultralytics.nn.modules.block.C3k2 [256, 64, 1, False] 17 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2] 18 [-1, 13] 1 0 ultralytics.nn.modules.conv.Concat [1] 19 -1 1 86720 ultralytics.nn.modules.block.C3k2 [192, 128, 1, False] 20 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2] 21 [-1, 10] 1 0 ultralytics.nn.modules.conv.Concat [1] 22 -1 1 378880 ultralytics.nn.modules.block.C3k2 [384, 256, 1, True] 23 [16, 19, 22] 1 430867 ultralytics.nn.modules.head.Detect [1, [64, 128, 256]] YOLO11n summary: 181 layers, 2,590,035 parameters, 2,590,019 gradients, 6.4 GFLOPs Transferred 448/499 items from pretrained weights Freezing layer &#39;model.23.dfl.conv.weight&#39; AMP: running Automatic Mixed Precision (AMP) checks... Traceback (most recent call last): File "F:\ultralytics-8.3.89\train.py", line 20, in <module> main() File "F:\ultralytics-8.3.89\train.py", line 8, in main results = model.train( ^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\model.py", line 810, in train self.trainer.train() File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\trainer.py", line 208, in train self._do_train(world_size) File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\trainer.py", line 323, in _do_train self._setup_train(world_size) File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\trainer.py", line 265, in _setup_train self.amp = torch.tensor(check_amp(self.model), device=self.device) ^^^^^^^^^^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\utils\checks.py", line 698, in check_amp assert amp_allclose(YOLO("yolo11n.pt"), im) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\utils\checks.py", line 686, in amp_allclose a = m(batch, imgsz=imgsz, device=device, verbose=False)[0].boxes.data # FP32 inference ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\model.py", line 182, in __call__ return self.predict(source, stream, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\model.py", line 560, in predict return self.predictor.predict_cli(source=source) if is_cli else self.predictor(source=source, stream=stream) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\predictor.py", line 175, in __call__ return list(self.stream_inference(source, model, *args, **kwargs)) # merge list of Result into one ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\anaconda\envs\model\Lib\site-packages\torch\utils\_contextlib.py", line 35, in generator_context response = gen.send(None) ^^^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\predictor.py", line 257, in stream_inference im = self.preprocess(im0s) ^^^^^^^^^^^^^^^^^^^^^ File "F:\ultralytics-8.3.89\ultralytics-8.1.0\ultralytics\engine\predictor.py", line 130, in preprocess im = torch.from_numpy(im) ^^^^^^^^^^^^^^^^^^^^ RuntimeError: Numpy is not available
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值