【YashanDB知识库】virt虚拟内存远大于res内存问题分析

YASDB内存占用简介

参数配置:

默认参数配置:DBMS_PARAM高级包生成配置参数

数据库内存配置,使用默认参数步骤:

1、DBMS_PARAM.OPTIMIZE(); //生成默认参数,使用总内存的80%

2、SELECT DBMS_PARAM.SHOW_RECOMMEND() FROM dual; //查看生成的参数

3、EXEC DBMS_PARAM.APPLY_RECOMMEND(); //应用参数,需要重启yasdb

文档路径:YashanDB Doc (yasdb.com)

内存占用计算参数:

DATA_BUFFER_SIZE VM_BUFFER_SIZE SHARE_POOL_SIZE LARGE_POOL_SIZE SCOL_DATA_BUFFER_SIZE COLUMNAR_VM_BUFFER_SIZE 主要是上面这些参数配置内存的总和 + 256M(其他小块内存)

问题:VIRT超过RES十几个G

如下图所示,yasdb满负荷运行后,0任务跑的情况下,virt内存:31.2g,实际内存:21.7g,虚拟内存比实际内存大了10g左右,虚拟内存远大于实际使用内存。

YASDB内存使用情况

yasdb参数配置,如下图:

按照yasdb主要内存占用计算:

DATA_BUFFER_SIZE(18306M) + VM_BUFFER_SIZE(2382M) + SHARE_POOL_SIZE(512M) + LARGE_POOL_SIZE(1G) + SCOL_DATA_BUFFER_SIZE(128M) + COLUMNAR_VM_BUFFER_SIZE (128M) = 22480M(21.95g)

RES 21.7g的内存使用和yasdb内存总占用数相符合。

VIRT内存为什么远远大于RES

VIRT:SWAP+RES(虚拟内存大小,包括进程使用的库、代码、数据等,如果申请100M,则增加100M大小)

RES:进程使用的,未被换出的物理内存(包括共享内存大小,如果申请100M,使用10M,则实际为10M)

mmap查看yasdb使用情况

如下图:

strace -f -e “brk,mmap,mu

### 原因分析 Java 项目启动后虚拟内存VIRT)占用过高,达到 22GB,通常与 Java 内存管理操作系统内存分配机制相关。以下是几个可能的原因: 1. **元空间(Metaspace)分配**:Java 8 及以上版本使用元空间替代永久代,元空间存放在操作系统本地内存中。当线程数量较多时,每个线程都会分配一个 arena,每个 arena 占用 64MB,导致虚拟地址空间大幅增加。 2. **glibc 的 Arena 分配**:glibc 在版本 2.10 引入了 arena 功能,用于加速多线程内存分配。每个线程分配一个本地 arena,每个 arena 占用 64MB,线程数量多时,虚拟地址空间会显著增加。 3. **mmap 分配**:当使用 `mmap` 并设置 `MAP_NORESERVE` 标志时,不会要求实际的物理内存 swap 空间存在。这会导致在 `top` 中看到非常高的 VIRT ,但实际上这只是地址空间的分配。 ### 解决方法 1. **调整元空间大小**:可以通过 JVM 参数调整元空间的大小,限制其占用的虚拟内存。例如,使用 `-XX:MaxMetaspaceSize` 参数设置最大元空间大小。 2. **减少线程数量**:优化应用程序,减少不必要的线程创建,降低每个线程分配的 arena 数量。 3. **调整 glibc 的 Arena 分配**:可以通过环境变量 `MALLOC_ARENA_MAX` 来限制 glibc 分配的 arena 数量。例如,将其设置为 1 可以显著减少虚拟内存的占用。 4. **监控分析内存使用**:使用内存分析工具(如 `jstat`, `jmap`, `VisualVM` 等)监控分析 Java 进程的内存使用情况,找出内存瓶颈。 ### 示例代码 ```java public class MetaspaceConfig { public static void main(String[] args) { // Example of setting MaxMetaspaceSize in code (not recommended, better to use JVM parameters) System.out.println("Max Metaspace Size set to 256MB"); } } ``` 启动时可以通过以下 JVM 参数设置元空间大小: ```bash java -XX:MaxMetaspaceSize=256m -jar your-application.jar ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值