SGA内存的优化

查看SGA有关的系统参数即介绍

SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE   该参数被设为true时,整个SGA将会被锁定在物理内存中,可避免部分SGA分配到到虚拟磁盘中,可以提高效率。该参数是静态的
pre_page_sga                         boolean     FALSE   设为true时,整个SGA会被读入到物理内存中,增加了所需要的物理内存和实例启动时间,但会提高系统的效率。该参数是静态的。
sga_max_size                         big integer 1600M   所有内存缓冲区的总和不能超过这一参数所定义的值,该参数是静态的,即修改spfile中该参数的值,需要重启数据库才能生效。
sga_target                           big integer 0       主管SGA的自动管理,Oracle称之为自动共享内存管理,ASMM
查看重做日志缓冲区的大小在DML很频繁的事物处理数据库系统时,可能就需要修改该参数的值。
SQL> show parameter log_buffer

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_buffer                           integer     6782976     单位是字节

调整log_buffer为10M,然后重启数据库生效。

SQL> select 10*1024*1024  from dual;

10*1024*1024
------------
    10485760

SQL> alter system set log_buffer = 10485760 scope = spfile;        --该参数只接受字节单位

System altered

调整sga_max_size,lock_sga,pre_page_sga的值。

SQL> alter system set sga_max_size = 4G scope=spfile;SQL> alter system set lock_sga = true scope = spfile;SQL> alter system set pre_page_sga = true scope = spfile;

注意:这四个静态参数修改一定的加上scope = spfile,并且需要重启才能生效。

使用ASSM功能

怎么才能使用ASSM功能呢? sga_target为非零的值,并且statistics_level的值为TYPICAL或者ALL。

SQL> alter system set sga_target = 512M;     ---调整sga_target的大小

System altered

SQL> show parameter statistics_level         --查看值,默认是TYPICAL

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
statistics_level                     string      TYPICAL

启用ASMM后内存缓冲区的大小将由Oracle自动进行管理,例如下面的参数:db_cache_size,java_pool_size ,shared_pool_size,并接他们的值自动设置为零。

重启后发现错误

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-00844: Parameter not taking MEMORY_TARGET into account
ORA-00851: SGA_MAX_SIZE 4294967296 cannot be set to more than MEMORY_TARGET 1677721600.

查阅资料得知:memory_target 是oracle11g用于自动内存管理的,它与memory_max_target是成对出现的,是11g内存管理上的新特 性,这一特性的出现使得 pga+sga做为整体内存使用被一致的纳入自动管理范畴。简而言之memory_target就是整个实例所能使用的内存大小, 包括PGA和SGA的 整体大小,在MEMORY_TARGET的内存大小之内,PGA和SGA所用的内存可以根据当前负载情况自动相互转换。 

如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参 数 MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态 调节MEMORY_TARGET的大小,但是不允许超过 MEMORY_MAX_TARGET的值。  

由此可见sga的尺寸是不能大于memory_target的。所以我们要调整memory_target和memory_max_target的值高于sga_max_size。

下面是解决改错误的方法:1. create pfile=‘D:\temp\pfile20150115.txt‘ from spfile;

2.修改pfile20150115.txt中的memory_target=1669332992成memory_target=5368709120。

3.在D:\app\zy\product\11.2.0\dbhome_1\database下找到SPFILEMYDEV.ORA,并将其备份成SPFILEMYDEV.ORA20160402.

4.创建新的动态参数文件: SQL>  create spfile from pfile=‘D:\temp\pfile20150115.txt‘;

5.启动数据库,OK,问题得到解决。

再次启动又出现报错:
SQL> startup
ORA-00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together

原来是lock_sga把整个内存锁住,如果memory_target和memory_max_target都设置了,锁定哪个值呢?所以只能有一个,回过头再把spfile中的lock_sga给关掉。

SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     TRUE
sga_max_size                         big integer 4G
sga_target                           big integer 512M
总结一下,以后调整sga的顺序是,先调整tmpfs的大小,再调整MEMORY_TARGET 的大小,最后调整sga,保证tmpfs>MEMORY_TARGET >sga+pga
时间: 2024-10-23 03:03:06

SGA内存的优化的相关文章

Android app性能优化大汇总之内存性能优化

写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在Android开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). 内存简介: RAM(random access memory)随机存取存储器.说白了就是内存. 一般Java在内存分配时会涉及到以下区域: 寄存器(R

Android内存性能优化(内部资料总结)

刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统的gc,很容易就造成了内存的浪费.   Java基于垃圾回收的内存机制 Java的内存管理机制会自动回收无用对象所占用的内存,减轻手工管理内存的负担 1.C/C++: 从申请.使用.释放都需要手工管理 2.Java:无用的对象的内存会被自动回收 什么样的对象是无用的对象 1.Java通过引用来操作一

Java千百问_07JVM架构(016)_java内存如何优化

点击进入_更多_Java千百问 1.java内存如何优化 了解jvm内存管理看这里:jvm是如何管理内存的 了解堆内存看这里:java堆内存是什么样的 java内存的优化主要是通过合理的控制GC来实现,主要原则: 1. 不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况(因为GC过后这个值是不会变化的). 2. 使用JDK提供的内存查看工具,比如JConsole和Java VisualVM. 3. 优化内存主要的目的是降低youngGC的频率.减少fullG

Tomcat 内存与优化篇

Tomcat 内存与优化一.Tomcat 运行环境介绍 1.Tomcat 本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和Java虚拟机: 2.Java 程序启动时JVM都会分配一个初始内存和最大内存给这个应用: 3.当应用程序用到最大内存的时刻,就会触发JVM做垃圾回收(GC)动作,释放被占用的内存: 4.因此想要调整Java程序启动时的初始内存和最大内存,需要向JVM申请: 5.如果初始内存大小设置过小,且此时初始化的应用对象过多,虚拟机就必须重复的加载内存来满足使用: 6.基于以

mysql大内存高性能优化方案

mysql优化是一个相对来说比较重要的事情了,特别像对mysql读写比较多的网站就显得非常重要了,下面我们来介绍mysql大内存高性能优化方案 8G内存下MySQL的优化 按照下面的设置试试看:key_buffer = 3840Mmax_allowed_packet = 16Mtable_cache = 1024sort_buffer_size = 32Mread_buffer_size = 32Mread_rnd_buffer_size = 32Mmyisam_sort_buffer_size

Java解读内存,优化编程

1.别用new Boolean 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如:       ps.setBoolean("isClosed",new Boolean(true));        ps.setBoolean("isClosed",new Boolean(isClosed));        ps.setBool

Android 内存泄漏优化汇总

android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非常easy创建OutOfMemoryError.我们的产品是最常见的错误是OutOfMemoryError的异常, 在解决这个异常时在网上发现非常多关于OutOfMemoryError的原因的介绍. OutOfMemoryError主要由下面几种情况造成: 1.数据库的cursor没有关闭. 操作S

Android内存性能优化(内部资料总结) eoe转载

刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统的gc,很容易就造成了内存的浪费. Java基于垃圾回收的内存机制 Java的内存管理机制会自动回收无用对象所占用的内存,减轻手工管理内存的负担 1.C/C++: 从申请.使用.释放都需要手工管理 2.Java:无用的对象的内存会被自动回收 什么样的对象是无用的对象 1.Java通过引用来操作一个具

新建oracle用户/表空间/增加ORACLE SGA内存

一种是为表空间增加数据文件,以下SQL语句请在数据库管理员sysman用户下执行: create tablespace lzs datafile 'd:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\lzs.dbf' size 2048M; create tablespace lzs_doc datafile 'd:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\lzs_doc.dbf' size 512M; 增加ORACLE SGA内存:(这步可