SQLServer的内存管理架构详解

目录
  • 一、Windows的虚拟内存管理器
  • 二、SQL Server 内存体系结构
    • 2.1、传统(虚拟)内存
    • 2.2、地址窗口扩展 (AWE) 内存
  • 三、从 SQL Server 2012 (11.x) 开始发生的改变
    • 3.1、对内存管理的更改
    • 3.2、对memory_to_reserve所做的更改
  • 四、动态内存管理
    • 4.1、堆栈大小
  • 五、缓冲区管理
    • 5.1、缓冲区管理的工作原理
    • 5.2、支持的功能
    • 5.3、磁盘 I/O
    • 5.4、长 I/O 请求
    • 5.5、长时间 I/O 请求的原因
  • 六、了解非一致性内存访问

一、Windows的虚拟内存管理器

地址空间的已提交区域由 Windows 虚拟内存管理器 (VMM) 映射到可用的物理内存。

虚拟内存系统允许物理内存的过度使用,因此虚拟内存与物理内存的比率可以超过 1:1。因此,较大的程序可以在具有各种物理内存配置的计算机上运行。但是,使用比所有进程的总平均工作集多得多的虚拟内存可能会导致性能不佳。

二、SQL Server 内存体系结构

SQL Server 根据需要动态获取和释放内存。通常,管理员不必指定应分配给 SQL Server 的内存量,尽管该选项仍然存在并且在某些环境中是必需的。

所有数据库软件的主要设计目标之一是最小化磁盘 I/O,因为磁盘读取和写入是最耗费资源的操作之一。SQL Server 在内存中构建一个缓冲池,以保存从数据库中读取的页。SQL Server 中的许多代码专用于最大程度地减少磁盘和缓冲池之间的物理读取和写入次数。SQL Server 试图在两个目标之间取得平衡:

  • 防止缓冲池变得太大,以致整个系统内存不足。
  • 通过最大化缓冲池的大小,最大限度地减少数据库文件的物理 I/O。

在负载较重的系统中,某些需要大量内存才能运行的大型查询无法获取请求的最小内存量,并在等待内存资源时收到超时错误。若要解决此问题,请增加查询等待选项。对于并行查询,请考虑降低最大并行度选项。

在内存压力很大的系统中,当查询未获得位图所需的最小内存时,查询计划中具有合并联接、排序和位图的查询可能会删除位图。这可能会影响查询性能,如果排序过程无法容纳在内存中,则可能会增加数据库中工作表的使用量,从而导致增长。若要解决此问题,请添加物理内存,或调整查询以使用不同的更快查询计划。

2.1、传统(虚拟)内存

所有 SQL Server 版本都支持 64 位平台上的传统内存。SQL Server 进程可以访问虚拟地址空间,最高可达 x64 体系结构上的操作系统最大值(SQL Server 标准版最多支持 128 GB)。对于 IA64 体系结构,限制为 7 TB(SQL Server 64 (2012.x) 及更高版本不支持 IA11)。

2.2、地址窗口扩展 (AWE) 内存

通过使用地址窗口化扩展插件 (AWE) 和 AWE 所需的内存中锁定页 (LPIM) 特权,可以在低虚拟内存条件下将大部分 SQL Server 进程内存锁定在物理 RAM 中。这在 32 位和 64 位 AWE 分配中都会发生。发生内存锁定的原因是 AWE 内存不通过 Windows 中的虚拟内存管理器,该管理器控制内存分页。AWE 内存分配 API 需要“锁定内存中的页”(SeLockMemoryPrivilege) 权限。因此,使用 AWE API 的主要好处是在系统上存在内存压力时将大部分内存驻留在 RAM 中。

如果授予 LPIM,我们强烈建议您将最大服务器内存 (MB) 设置为特定值,而不是保留默认值 2,147,483,647 兆字节 (MB)。

如果未启用 LPIM,SQL Server 将切换到使用常规内存,并且在操作系统内存耗尽的情况下,错误日志中可能会报告错误 17890。

三、从 SQL Server 2012 (11.x) 开始发生的改变

3.1、对内存管理的更改

从 SQL Server 2012 (11.x) 开始,单页分配、多页分配和 CLR 分配都合并到“任何大小”页面分配器中,并包含在由最大服务器内存 (MB) 和最小服务器内存 (MB) 配置选项控制的内存限制中。此更改为通过 SQL Server 内存管理器的所有内存要求提供了更准确的大小调整功能。

从 SQL Server 2012 (11.x) 开始,SQL Server 分配的内存可能会超过最大服务器内存 (MB) 设置中指定的值。当总服务器内存 (KB) 值已达到目标服务器内存 (KB) 设置时,可能会发生此行为,如最大服务器内存 (MB) 指定。如果由于内存碎片而没有足够的连续可用内存来满足多页内存请求(超过 8 KB)的需求,则 SQL Server 可以执行过度使用,而不是拒绝内存请求。

执行此分配后,资源监视器后台任务将开始向所有内存使用者发出释放分配的内存的信号,并尝试使总服务器内存 (KB) 值低于目标服务器内存 (KB) 规范。因此,SQL Server 内存使用情况可能会短暂超过最大服务器内存 (MB) 设置。在此情况下,总服务器内存 (KB) 性能计数器读数将超过最大服务器内存 (MB) 和目标服务器内存 (KB) 设置。

3.2、对memory_to_reserve所做的更改

在较旧版本的 SQL Server 中,SQL Server 内存管理器留出一部分进程虚拟地址空间 (VAS) 供多页分配器 (MPA)、CLR 分配器、SQL Server 进程中线程堆栈的内存分配和直接窗口分配 (DWA) 使用。虚拟地址空间的这一部分也称为“内存要离开”或“非缓冲池”区域。

为这些分配保留的虚拟地址空间由memory_to_reserve配置选项确定。SQL Server 使用的默认值为 256 MB。

由于“任何大小”页面分配器还处理大于 8 KB 的分配,因此memory_to_reserve值不包括多页分配。除此更改外,此配置选项的其他所有内容都保持不变。

四、动态内存管理

SQL Server 数据库引擎的默认内存管理行为是根据需要获取尽可能多的内存,而不会在系统上造成内存不足。SQL Server 数据库引擎通过使用 Microsoft Windows 中的内存通知 API 来执行此操作。

当 SQL Server 动态使用内存时,它会定期查询系统以确定可用内存量。维护此可用内存可防止操作系统 (OS) 分页。如果可用内存较少,SQL Server 将向操作系统释放内存。如果有更多内存可用,SQL Server 可能会分配更多内存。SQL Server 仅在其工作负荷需要更多内存时才添加内存;静态服务器不会增加其虚拟地址空间的大小。如果您注意到任务管理器和性能监视器在使用动态内存管理时显示可用内存稳定减少,这是默认行为,不应被视为内存泄漏。

最大服务器内存控制 SQL Server 内存分配、编译内存、所有缓存(包括缓冲池)、查询执行内存授予、锁管理器内存和 CLR1记忆(基本上是在sys.dm_os_memory_clerks中找到的任何记忆职员)。

CLR 内存在从 SQL Server 2012 (11.x) 开始的max_server_memory分配下进行管理。

示例:查询返回有关当前分配的内存的信息。

SELECT
  physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB,
    large_page_allocations_kb/1024 AS sql_large_page_allocations_MB,
    locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,
    virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB,
    virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB,
    virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,
    page_fault_count AS sql_page_fault_count,
    memory_utilization_percentage AS sql_memory_utilization_percentage,
    process_physical_memory_low AS sql_process_physical_memory_low,
    process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;

4.1、堆栈大小

线程堆栈的内存、CLR、文件.dll扩展过程、分布式查询引用的 OLE DB 提供程序、Transact-SQL 语句中引用的自动化对象以及非 SQL Server DLL 分配的任何内存不受最大服务器内存 (MB) 的控制。

当 SQL Server 启动时,它会根据多个参数(如系统上的物理内存量、服务器线程数和各种启动参数)计算缓冲池的虚拟地址空间的大小。SQL Server 为缓冲池保留其进程虚拟地址空间的计算量,但它仅获取(提交)当前加载所需的物理内存量。

然后,实例会根据需要继续获取内存以支持工作负载。随着越来越多的用户连接和运行查询,SQL Server 会按需获取更多的物理内存。SQL Server 实例继续获取物理内存,直到达到其最大服务器内存 (MB) 分配目标或操作系统指示不再有多余的可用内存;当内存超过最小服务器内存设置时,它会释放内存,并且操作系统指示可用内存不足。

当其他应用程序在运行 SQL Server 实例的计算机上启动时,它们会消耗内存,并且可用物理内存量将低于 SQL Server 目标。SQL Server 实例调整其内存消耗。如果另一个应用程序停止并且有更多内存可用,则 SQL Server 实例会增加其内存分配的大小。SQL Server 每秒可以释放和获取几兆字节的内存,从而能够快速适应内存分配更改。

五、缓冲区管理

SQL Server 数据库的主要用途是存储和检索数据,因此密集磁盘 I/O 是数据库引擎的核心特征。由于磁盘 I/O 操作可能会消耗许多资源并且需要相对较长的时间才能完成,因此 SQL Server 专注于提高 I/O 的效率。缓冲液管理是实现这种效率的关键组成部分。缓冲区管理组件由两种机制组成:用于访问和更新数据库页的缓冲区管理器,以及用于减少数据库文件 I/O 的缓冲区缓存(也称为缓冲池)。

5.1、缓冲区管理的工作原理

缓冲区是内存中的 8 KB 页,大小与数据页或索引页相同。因此,缓冲区缓存分为 8 KB 页。缓冲区管理器管理将数据或索引页从数据库磁盘文件读取到缓冲区缓存以及将修改的页写回磁盘的功能。页将保留在缓冲区缓存中,直到缓冲区管理器需要缓冲区来读取更多数据。仅当数据被修改时,数据才会写回磁盘。缓冲区缓存中的数据在写回磁盘之前可以多次修改。

当 SQL Server 启动时,它会根据多个参数(如系统上的物理内存量、配置的最大服务器线程数和各种启动参数)计算缓冲区缓存的虚拟地址空间的大小。SQL Server 为缓冲区缓存保留此计算量的进程虚拟地址空间(称为内存目标),但它仅获取(提交)当前加载所需的物理内存量。您可以查询sys.dm_os_sys_info目录视图中的committed_target_kb列和committed_kb列,以分别返回保留为内存目标的页数和缓冲区缓存中当前提交的页数。

SQL Server 启动和缓冲区缓存获取其内存目标之间的时间间隔称为上升。在此期间,读取请求会根据需要填充缓冲区。例如,单个 8 KB 页读取请求填充单个缓冲区页。这意味着上升取决于客户端请求的数量和类型。通过将单页读取请求转换为对齐的八页请求(构成一个范围)来加快提升速度。这使得爬坡可以更快地完成,尤其是在具有大量内存的机器上。

由于缓冲区管理器使用 SQL Server 进程中的大部分内存,因此它与内存管理器配合使用,以允许其他组件使用其缓冲区。缓冲区管理器主要与以下组件交互:

  • 资源管理器,用于控制总体内存使用情况,在 32 位平台中,用于控制地址空间使用情况。
  • 用于低级别文件 I/O 操作的数据库管理器和 SQL Server 操作系统 (SQLOS)。
  • 用于预写日志记录的日志管理器。

5.2、支持的功能

  • 缓冲区管理器可识别非一致性内存访问 (NUMA)。缓冲区缓存页分布在硬件 NUMA 节点上,这允许线程访问在本地 NUMA 节点上分配的缓冲区页,而不是从外部内存访问。
  • 缓冲区管理器支持热添加内存,允许用户在不重新启动服务器的情况下添加物理内存。
  • 缓冲区管理器支持 64 位平台上的大页面。页面大小特定于 Windows 版本。
  • 缓冲区管理器提供通过动态管理视图公开的额外诊断。可以使用这些视图监视特定于 SQL Server 的各种操作系统资源。

5.3、磁盘 I/O

缓冲区管理器仅执行对数据库的读取和写入。其他文件和数据库操作(如打开、关闭、扩展和收缩)由数据库管理器和文件管理器组件执行。

缓冲区管理器的磁盘 I/O 操作具有以下特征:

  • 所有 I/O 都是异步执行的,这允许调用线程继续处理,而 I/O 操作在后台进行。
  • 所有 I/O 都在调用线程中发出,除非正在使用关联 I/O 选项。关联性 I/O 掩码选项将 SQL Server 磁盘 I/O 绑定到指定的 CPU 子集。在高端 SQL Server 联机事务处理 (OLTP) 环境中,此扩展可以增强发出 I/O 的 SQL Server 线程的性能。
  • 多页 I/O 通过分散-收集 I/O 完成,这允许将数据传入或传出不连续的内存区域。这意味着 SQL Server 可以快速填充或刷新缓冲区缓存,同时避免多个物理 I/O 请求。

5.4、长 I/O 请求

缓冲区管理器报告任何未完成至少 15 秒的 I/O 请求。这有助于系统管理员区分 SQL Server 问题和 I/O 子系统问题。报告错误消息 833,并显示在 SQL Server 错误日志中。长 I/O 可以是读取或写入;消息中当前未指示。长 I/O 消息是警告,而不是错误。它们并不表示 SQL Server 的问题,而是表示底层 I/O 系统的问题。报告这些消息是为了帮助系统管理员更快地找到 SQL Server 响应时间不佳的原因,并区分 SQL Server 无法控制的问题。因此,它们不需要任何操作,但系统管理员应调查 I/O 请求花费这么长时间的原因,以及时间是否合理。

5.5、长时间 I/O 请求的原因

较长的 I/O 消息可能表示 I/O 被永久阻止且永远不会完成(称为丢失 I/O),或者只是表示它尚未完成。无法从消息中判断出哪种情况,尽管丢失的 I/O 通常会导致闩锁超时。
长 I/O 通常表示 SQL Server 工作负荷对于磁盘子系统来说过于密集。在以下情况下,可能指示磁盘子系统不足:

  • 在繁重的 SQL Server 工作负荷期间,错误日志中会出现多个长 I/O 消息。
  • 性能监视器计数器显示较长的磁盘延迟、较长的磁盘队列或无磁盘空闲时间。

长 I/O 也可能是由 I/O 路径中的组件(例如,驱动程序、控制器或固件)不断推迟处理旧的 I/O 请求,转而处理更接近磁盘磁头当前位置的新请求引起的。根据哪些请求最接近读/写头的当前位置来优先处理请求的常用技术称为“电梯搜索”。这可能很难用性能监视器工具证实,因为大多数 I/O 都会及时得到维护。执行大量顺序 I/O 的工作负载(如备份和还原、表扫描、排序、创建索引、批量加载和清零文件)可能会加剧长 I/O 请求。

六、了解非一致性内存访问

SQL Server 可识别非一致性内存访问 (NUMA),并且在没有特殊配置的 NUMA 硬件上表现良好。随着时钟速度和处理器数量的增加,减少使用这种额外处理能力所需的内存延迟变得越来越困难。为了规避这种情况,硬件供应商提供了大型 L3 缓存,但这只是一个有限的解决方案。NUMA 体系结构为此问题提供了可扩展的解决方案。

SQL Server 旨在利用基于 NUMA 的计算机,而无需进行任何应用程序更改。

到此这篇关于SQLServer的内存管理架构详解的文章就介绍到这了,更多相关SQLServer内存管理架构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 优化SQL Server的内存占用之执行缓存

    首先说明一下SQL Server内存占用由哪几部分组成.SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer).执行缓存(Procedure Cache).以及SQL Server引擎程序.SQL Server引擎程序所占用缓存一般相对变化不大,则我们进行内存调优的主要着眼点在数据缓存和执行缓存的控制上.本文主要介绍一下执行缓存的调优.数据缓存的调优将在另外的文章中介绍. 对于减少执行缓存的占用,主要可以通过使用参数化查询减少内存占用. 1.使用参数化查询减少执行缓存

  • SQL Server 2008 R2占用cpu、内存越来越大的两种解决方法

    SQL Server 2008 R2运行越久,占用内存会越来越大. 第一种: 有了上边的分析结果,解决方法就简单了,定期重启下SQL Server 2008 R2数据库服务即可,使用任务计划定期执行下边批处理: net stop sqlserveragent net stop mssqlserver net start mssqlserver net start sqlserveragent 第二种: 进入Sql server 企业管理器(管理数据库和表的,这个都不知道就不用往下看了),在数据库

  • SQL Server 数据页缓冲区的内存瓶颈分析

    SQL Server会把经常使用到的数据缓存在内存里(就是数据页缓存),用以提高数据访问速度.因为磁盘访问速度远远低于内存,所以减少磁盘访问量同样是数据库优化的重要方面. 当数据页缓存区出现内存不足,则会出现查询慢,磁盘忙等等问题. 分析方法:主要是用到性能计数器. 查看如下性能计数器: 1. SQL SERVER:Buffer Manager-Lazy Writes/sec:内存不足则会频繁调用Lazy Writer把数数据写入磁盘,此值会经常不为0. 2. SQL SERVER:Buffer

  • 浅谈SQL Server 对于内存的管理[图文]

    理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) 对于计算机来说,存储体系是分层级的.离CPU越近的地方速度愉快,但容量越小(如图1所示).比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘.但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级.比如硬盘通常要比同时代的内存大一个数量级. 图1

  • 解决SQL Server虚拟内存不足情况

    解决SQL Server虚拟内存不足情况 症状 在具有 2 GB 或更多 RAM 的计算机上,除了 256 MB (SQL Server 7.0) 或 384 MB (SQL Server 2000) 虚拟地址空间之外,SQL Server 在启动过程中保留剩下的所有虚拟地址空间以供缓冲池使用.另外,为了存储数据和过程缓存,SQL Server 使用缓冲池内存为来自 SQL Server 进程的大多数小于 8 KB 的其他内存请求提供服务.剩下的未保留内存准备用于不能从缓冲池得到服务的其他分配.

  • SQL语句实现查询SQL Server内存使用状况

    SELECT type,--Clerk的类型 sum(virtual_memory_reserved_kb)as vm_Reserved_kb,--保留的内存 sum(virtual_memory_committed_kb)as vm_Committed_kb,--提交的内存 sum(awe_allocated_kb)as awe_Allocated_kb,--开启AWE后使用的内存 sum(shared_memory_reserved_kb)as sm_Reserved_kb,--共享的保留内

  • SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息

    在SQL SERVER中如何通过SQL语句获取服务器硬件和系统信息呢?下面介绍一下如何通过SQL语句获取处理器(CPU).内存(Memory).磁盘(Disk)以及操作系统相关信息.如有不足和遗漏,敬请补充.谢谢! 一:查看数据库服务器CPU的信息 ---SQL 1:获取数据库服务器的CPU型号 EXEC xp_instance_regread 'HKEY_LOCAL_MACHINE', 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', 'Pro

  • SQLServer的内存管理架构详解

    目录 一.Windows的虚拟内存管理器 二.SQL Server 内存体系结构 2.1.传统(虚拟)内存 2.2.地址窗口扩展 (AWE) 内存 三.从 SQL Server 2012 (11.x) 开始发生的改变 3.1.对内存管理的更改 3.2.对memory_to_reserve所做的更改 四.动态内存管理 4.1.堆栈大小 五.缓冲区管理 5.1.缓冲区管理的工作原理 5.2.支持的功能 5.3.磁盘 I/O 5.4.长 I/O 请求 5.5.长时间 I/O 请求的原因 六.了解非一致

  • C语言中动态内存管理图文详解

    目录 1.动态内存开辟的原因 2.动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 3.常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free 3.4使用释放一块动态开辟内存的一部分 3.5对同一块动态内存多次释放 3.6动态开辟内存忘记释放(内存泄漏) 4.练习 4.1练习1 4.1练习2 4.3练习3 4.4练习4 5.C/C++程序的内存开辟 总结 1.动态内存开辟的原因 常见的内存

  • 关于C/C++内存管理示例详解

    1.内存分配方式 在C++中,内存分成五个区,分别是堆.栈.自由存储区.静态存储区和常量存储区. 1) 栈 执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置处理器指令集中,效率很高,但分配的内存容量有限. 2) 堆 由new分配的内存块,释放由程序员控制.如果程序员没有释放,那么就在程序结束的时候,被操作系统回收. 3) 自由存储区 由malloc等分配的内存块,用free结束自己的生命. 4) 静态存储区 全局变量和静态变量被分配到

  • C/C++指针与内存管理图文详解

    目录 一.指针 二.数组 总结 指针和内存管理始终是C/C++比较容易模糊的知识点,但在C/C++编程中又绕不开的地方,特别在下位机上,会频繁的与指针打交道,如果概念模糊,一不小心就会写出冗余的代码,可能会引起多余内存开销或者直接影响运行速度. 一.指针 1.计算机内存主要分成这几个区,每个区又分成无数个字节(Byte),每个字节(Byte)都有唯一的编号,而这个编号就这个字节的指针地址.一般程序能读写的区域只有全局变量.堆区.栈区.下面是计算机内存的示意图: 每个字节(Byte)对应的编号地址

  • Nginx 介绍及日常管理的详解

    Nginx 介绍及日常管理的详解 Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好.中国大陆使用nginx网站用户有:新浪.网易. 腾讯等.本文简要描述了Nginx的基本特性及其配置文件的简单描述. 一.Nginx的工作进程 1.一个主进程: 主进程的主要目的是读取和评估配置,启动.终止及维

  • Tomcat核心组件及应用架构详解

    Web 容器是什么? 让我们先来简单回顾一下 Web 技术的发展历史,可以帮助你理解 Web 容器的由来. 早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache.Nginx)向浏览器返回静态 HTML,浏览器负责解析 HTML,将结果呈现给用户. 随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要一些扩展机制能够让 HTTP 服务器调用服务端程序. 于是 Sun 公司推出了 Servlet 技术.你可以把 Se

  • JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)

    Apache Arrow是是各种大数据工具(包括BigQuery)使用的一种流行格式,它是平面和分层数据的存储格式.它是一种加快应用程序内存密集型. 数据处理和数据科学领域中的常用库: Apache Arrow.诸如Apache Parquet,Apache Spark,pandas之类的开放源代码项目以及许多商业或封闭源代码服务都使用Arrow.它提供以下功能: 内存计算 标准化的柱状存储格式 一个IPC和RPC框架,分别用于进程和节点之间的数据交换 让我们看一看在Arrow出现之前事物是如何

  • Java GC 机制与内存分配策略详解

    Java GC 机制与内存分配策略详解 收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现 自动内存管理解决的是:给对象分配内存 以及 回收分配给对象的内存 为什么我们要了解学习 GC 与内存分配呢? 在 JVM 自动内存管理机制的帮助下,不再需要为每一个new操作写配对的delete/free代码.但出现内存泄漏和溢出的问题时,如果不了解虚拟机是怎样使用内存的,那么排查错误将是一项非常艰难的工作. GC(垃圾收集器)在对堆进行回收前,会先确定哪些对象"存活",哪些已经&quo

  • Java语言中的内存泄露代码详解

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同. JAVA中的内存管理 要了解Java中的内存泄露,首先就得知道Java中的内存是如何管理的. 在Java程序中,我们通常使用new为对象分配内存,而这些内存空间都在堆(Heap)上. 下面看一个示例: public class Simple { public static vo

  • Linux系统诊断之内存基础深入详解

    1.背景 谈及linux内存,很多时候,我们会关注free,top等基础命令.当系统遇到异常情况时,内存问题的根因追溯,现场诊断时,缺乏深层次的debug能力.本篇幅不做深层讨论,能把当前系统的问题描述清楚,是每个SRE应该具备的最基础能力. 2. free 2.1 free命令原理 free是通过查看 /proc/meminfo 来获取内存的使用情况.但是 /proc/meminfo 这个文件又是怎么来的?我们先了解下 /proc 目录: /proc 是一个虚拟文件系统,该目录下的所有文件都是

随机推荐