【发布时间】:2023-01-13 16:25:06
【问题描述】:
说 SGA 将是正确的总是在启动实例时分配服务器内存,以及它将总是关闭实例时释放服务器内存?
谢谢您的帮助 !
马科斯。
我想了解这个概念
【问题讨论】:
标签: oracle
说 SGA 将是正确的总是在启动实例时分配服务器内存,以及它将总是关闭实例时释放服务器内存?
谢谢您的帮助 !
马科斯。
我想了解这个概念
【问题讨论】:
标签: oracle
是的,当你启动一个实例时,一个共享内存段将被分配sga_max_size的大小。所有 Oracle 进程都将附加到这个共享内存段。当您关闭实例时,内存将被释放。
当实例运行时,SGA 内存被静态(通过设置各种 *size 参数)或动态(通过设置 sga_target)管理。这会促使内存从一个 SGA 组件重新分配到另一个组件,例如,在共享池和缓冲区缓存之间。这是按需或即时发生的,可以手动或自动进行。但是它必须使用的总内存“池”在实例的生命周期内是硬上限 sga_max_size。要更改它,需要更改 init 参数并启动实例。
请记住,Oracle 进程还有PGA/UGA,这是私有分配的内存,每个进程将根据需要进行分配,并在不需要时释放。显然,当一个进程退出时,它会释放它的任何私有内存。
【讨论】:
好吧,是的,不是。 SGA 位于共享内存段中。所以你可以在 Linux 中使用 ipcs 命令列出它们。
Oracle 从 Linux 内核中保留的整个 SGA 大小。无论“保留”在今天意味着什么。如果您使用大页面,您可以在 alert.log 或 /proc/meminfo 中看到它。
然后,每当 Oracle 访问共享内存段中的某些页面时,内核就会延迟分配 RAM。如果你真的需要在启动期间分配 SGA,你必须使用参数pre_page_sga
PRE_PAGE_SGA 决定Oracle在实例启动时是否将整个SGA读入内存。然后为 SGA 的每个页面预先构建操作系统页表条目。此设置可以增加实例启动所需的时间量,但它可能会减少 Oracle 在启动后达到其全部性能所需的时间量。
如果正确关闭 Oracle,所有共享内存段都应该被释放。您可以再次使用 ipcs 命令对其进行验证。
【讨论】: