web-dev-qa-db-ja.com

チューニングJava ORA-04031取得後のプール

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を使用していないときにこれを調整する方法に少し混乱しています。

この問題を解決するにはどうすればよいですか?

  1. Javaプールサイズを増やすための私の最良のオプションは何ですか?
  2. もしそうなら、AMMを使用していないときにこれを行うにはどうすればよいですか?
2
TrojanName

AMMまたはASMM?

Oracle Databaseインスタンスには、2つの形式のメモリー管理があります。

  1. 自動メモリ管理(AMM)
  2. 自動共有メモリ管理(ASMM)

MEMORY_MAX_TARGETMEMORY_TARGETに値を設定した場合、AMMモードになります。 Oracleインスタンスは、MEMORY_TARGET設定までメモリを割り当てます。パフォーマンスへの影響に気づいた場合は、インスタンスを再起動しなくても、MEMORY_TARGETの値をMEMORY_MAX_TARGETサイズまで増やすことができます。

インスタンスのMEMORY_MAX_TARGETMEMORY_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)。

SGA_TARGETは何を使用していますか?

次に、次のヒントがあります。

強調私のもの)

表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インスタンスがこれらの変更にどのように応答するかを確認してください。

参考文献

1

SGA_TARGETが設定され、Java_POOL_SIZE = 0の場合、少なくとも自動共有メモリ管理を使用しているため、Javaプールはすでに自動チューニングされています。最小プールサイズになるJava_POOL_SIZE値を指定できますOracleは、必要に応じてそれをより高く調整することを選択する場合があります。Java_POOL_SIZEを変更すると、データベースの再起動が必要になります。デフォルトのJava_POOL_SIZEを増やすと、他のSGAプールからメモリが奪われるため、SGA_TARGET値も増やす必要がある場合があります。

https://docs.Oracle.com/en/database/Oracle/oracle-database/12.2/refrn/Java_POOL_SIZE.html#GUID-F24C4770-0B7C-42BD-9AAD-0EC1E92A90F6

1
pmdba