Windows 2012 RC2でOracle 12.2.0.1 Standardエディションを実行しています。 Oracleの自動メモリ管理を実行していません。
これらはアラートログに表示されます。
ORA-04031: unable to allocate 4096 bytes of shared memory ("Java pool","prv//////LBKLAGIMAAAAAAAA","JOXLE^aff7380e",":SGAClass")
開発チームがSQLコードを修正している間、私が最初に試みたのは共有プールをフラッシュして当面の問題を解決することでした。
ALTER SYSTEM FLUSH SHARED_POOL;
そのとき初めて、Javaプールは実際には共有プールの一部ではないことに気づきました。そのため、Javaプールを見てみました。
これは、私のJavaプールが約32MBであることを示しています:
SQL> select * from v$javapool;
CATEGORY MEMUSED CON_ID ------------------------------------------------ ---------- ---------- :Intern 973440 0 :SGAClass 32103240 0 :SROState 81120 0
私はこのチューニングツールを実行しましたが、正しく解釈できれば、Javaプールサイズを大きくしてもあまりメリットがないと言っています。
select
estd_lc_size,
Java_pool_size_for_estimate,
Java_pool_size_factor
from
v$Java_pool_advice;
ESTD_LC_SIZE Java_POOL_SIZE_FOR_ESTIMATE Java_POOL_SIZE_FACTOR ------------ --------------------------- --------------------- 8 16 .5 24 32 1 25 48 1.5 25 64 2 25 80 2.5 25 96 3 25 112 3.5 25 128 4 25 144 4.5 25 160 5 25 176 5.5
私は次のクエリを実行しました ここのOracleドキュメントから取得 とSGA_TARGET値が適切であることを示唆しているようです!
SELECT (
(SELECT SUM(value) FROM V$SGA) -
(SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)
) "SGA_TARGET"
FROM DUAL;
SGA_TARGET ---------- 5167382528 = 4928 MB i.e. same as what it currently is!
わかります:
MEMORY_TARGET = 0
SGA_MAX_SIZE = 4928M
SGA_TARGET = 4928M
Java_POOL_SIZE = 0
SHARED_POOL_SIZE = 0
DB_CACHE_SIZE = 0
DB_KEEP_CACHE_SIZE = 0
MEMORY_MAX_TARGET = 0
... AMMを使用していないときにこれを調整する方法に少し混乱しています。
この問題を解決するにはどうすればよいですか?
Oracle Databaseインスタンスには、2つの形式のメモリー管理があります。
MEMORY_MAX_TARGET
とMEMORY_TARGET
に値を設定した場合、AMMモードになります。 Oracleインスタンスは、MEMORY_TARGET
設定までメモリを割り当てます。パフォーマンスへの影響に気づいた場合は、インスタンスを再起動しなくても、MEMORY_TARGET
の値をMEMORY_MAX_TARGET
サイズまで増やすことができます。
インスタンスのMEMORY_MAX_TARGET
とMEMORY_TARGET
の値を設定していない場合、SGA_TARGET
パラメータの値を設定しているため、ASMMモードであると想定できます。
ASMMモードでは、次のパラメーターが自動的に構成されます。
表6-2自動サイズのSGAコンポーネントと対応するパラメータ
SHARE_POOL_SIZE
LARGE_POOL_SIZE
Java_POOL_SIZE
DB_CACHE_SIZE
STREAMS_POOL_SIZE
参照:表6-2 (Oracle Docs)
次のことを示す小さなメモもあります。
SGA_TARGET
をゼロ以外の値に設定することに加えて、自動サイズ設定されたSGAコンポーネントの完全自動チューニングを有効にするには、表6-2にリストされているすべての初期化パラメーターをゼロに設定する必要があります。
したがって、パラメーターの最小値を手動で割り当てたい場合を除き、Java_POOL_SIZE
をゼロ以外の値に設定する必要はありません。それ以外の場合、OracleはSGA_TARGET
サイズの境界内にメモリを割り当てます。これは現在4 GBをわずかに超えています(4928M
)。
次に、次のヒントがあります。
(強調私のもの)
表6-にリストされている手動サイズのパラメータは、設定されている場合、
SGA_TARGET
からメモリを取得します表6-2にリストされているコンポーネントで利用可能なものを残します。
表6-のパラメータは次のとおりです。
LOG_BUFFER
DB_KEEP_CACHE_SIZE
DB_RECYCLE_CACHE_SIZE
DB_nK_CACHE_SIZE
参照:表6- (Oracle Docs)
表6-のコンポーネントが使用するメモリが多すぎる場合、SGA_TARGET
プールに十分なメモリが残っていないため、のコンポーネントに十分なメモリを自動的に割り当てることができません。表6-2またはJava_POOL_SIZE
パラメータの場合。エラーを観察できます。
ORA-04031:4096バイトの共有メモリを割り当てることができません( "Javaプール"、 "prv ////// LBKLAGIMAAAAAAAA"、 "JOXLE ^ aff7380e"、 ":SGAClass")
SGAプールに動的パラメータを自動的に調整できる十分なメモリを確保するには、SGA_TARGET
パラメータを現在の値よりも大きい値に増やす必要がある場合があります。
8192M
を試して、Oracleインスタンスがこれらの変更にどのように応答するかを確認してください。
SGA_TARGETが設定され、Java_POOL_SIZE = 0の場合、少なくとも自動共有メモリ管理を使用しているため、Javaプールはすでに自動チューニングされています。最小プールサイズになるJava_POOL_SIZE値を指定できますOracleは、必要に応じてそれをより高く調整することを選択する場合があります。Java_POOL_SIZEを変更すると、データベースの再起動が必要になります。デフォルトのJava_POOL_SIZEを増やすと、他のSGAプールからメモリが奪われるため、SGA_TARGET値も増やす必要がある場合があります。