2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Liberty の Non-Heap メモリーの使用量を REST API で取得する ~MBean の属性を取得する~

Last updated at Posted at 2025-07-07

はじめに

今回は、Liberty の Non-Heap メモリー(Native メモリー)の使用量を REST API で取得する方法をまとめてみました。
使用する REST API は、Liberty が REST コネクターとして以前から提供している機能です。REST コネクターを使用すると、Java の JMX MBean (Java Management Extensions (JMX) 管理 Bean) が提供する機能を REST API で実行することができます。

準備

REST コネクターを利用するには、以下の2つの準備が必要となります。

  • restConnector-2.0 フィーチャーを有効にする
  • administrator ロールを持つユーザーをレジストリーに登録する

詳細は、前回執筆した「Liberty のテスト接続機能を利用する」の「準備」の部分を参照してください。

MBean 属性の取得方法を確認する

上記の準備を施した Liberty を起動し、ブラウザーで下記の URL にアクセスすると、REST API のヘルプ画面が表示されます。尚、ベーシック認証で保護されていますので、上記の方法で定義した administrator ロールを持つユーザーでアクセスする必要があります。

  • https://(ホスト):(ポート)/IBMJMXConnectorREST/api

Root.png

この画面の左上に表示されたドロップダウンから実行したい操作を選択すると、選択した操作の呼び出し方法が確認できます。
今回は、MBean の属性を取得する操作を利用します。ドロップダウンから「Attributes > Query single Attribute」を選択すると、その方法が表示されます。

QuerySingleAttribute.png

属性の取得は単純な操作なので、ヘルプ画面に示されたように、下記の URL に HTTP の GET でアクセスすれば良いわけです。
この URL も、ベーシック認証で保護されていますので、前述の方法で定義した administrator ロールを持つユーザーでアクセスすることになります。

  • https://(ホスト):(ポート)/IBMJMXConnectorREST/mbeans/{objectName}/attributes/{attribute}

この URL を構成する {objectName} は、MBean の名前のことです。次の URL にアクセスすると、その時点で利用可能な MBean の情報(objectName, クラス名、URL)がリストできます。
尚、Liberty の MBean は、該当の機能が初めて使用されるときに登録されますので、アクセスした時点で使用されていない機能の MBean はリストされません。

  • https://(ホスト):(ポート)/IBMJMXConnectorREST/mbeans
実行例:Liberty に存在する MBean の取得
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans | jq
[
  … … 省略 … …
  {
    "objectName": "java.lang:type=Memory",
    "className": "com.ibm.lang.management.internal.ExtendedMemoryMXBeanImpl",
    "URL": "/IBMJMXConnectorREST/mbeans/java.lang%3Atype%3DMemory"
  },
  … … 省略 … …
]

URL を構成する {attribute} は、MBean の属性の名前で、ドキュメント等で名前と意味を確認することになります。
尚、以下の URL にアクセスすると、MBean の全ての属性をまとめて取得することができ、属性の名前も確認できます。

  • https://(ホスト):(ポート)/IBMJMXConnectorREST/mbeans/{objectName}/attributes
実行例:java.lang:type=Memory MBean の全ての属性の名前と値を取得
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=Memory/attributes | jq
[
  … … 省略 … …
  {
    "name": "HeapMemoryUsage",
    "value": {
      "value": {
        "committed": "65339392",
        "init": "8388608",
        "max": "4217110528",
        "used": "54779832"
      },
  … … 省略 … …
  {
    "name": "NonHeapMemoryUsage",
    "value": {
      "value": {
        "committed": "515547404",
        "init": "429846516",
        "max": "-1",
        "used": "152681444"
      },
  … … 省略 … …

尚、Liberty や JVM の MBean の情報は、以下の URL で確認できます。

Non-Heap メモリーの使用量を確認する

今回は、Semeru Runtime 17 で稼働する Liberty の Non-Heap メモリーの使用量を確認します。

使用する MBean の説明

上記の実行結果で少しネタバレしていますが、Non-Heap メモリーの使用量は、java.lang:type=Memory MBean の NonHeapMemoryUsage 属性で確認できます。

  • メモリーの情報を提供する MBean の名前
    • java.lang:type=Memory

また、Heap および Non-Heap メモリーの詳細(内訳)は、各 MemoryPool の Usage 属性として取得できるようになっています。今回の環境に存在する MemoryPool は以下の通りです。

  • Heap メモリーの MemoryPool の情報を提供する MBean の名前
    • java.lang:type=MemoryPool,name=nursery-allocate
    • java.lang:type=MemoryPool,name=nursery-survivor
    • java.lang:type=MemoryPool,name=tenured-SOA
    • java.lang:type=MemoryPool,name=tenured-LOA
  • Non-Heap メモリーの MemoryPool の情報を提供する MBean の名前
    • java.lang:type=MemoryPool,name=class storage
    • java.lang:type=MemoryPool,name=JIT code cache
    • java.lang:type=MemoryPool,name=JIT data cache
    • java.lang:type=MemoryPool,name=miscellaneous non-heap storage

目的の MemoryPool が Heap なのか Non-Heap なのかは、Type 属性で確認できます。
(MBean 名のスペースを %20 でエスケープする必要があります。)

MemoryPool の Type 属性の確認
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=class%20storage/attributes/Type | jq
{
  "value": "NON_HEAP",
  "type": "java.lang.String"
}

ここでご紹介した MBean の詳細は、下記のドキュメントで確認できます。

Non-Heap メモリーの使用量を確認してみる

MemoryPool の各 MBean から Non-Heap メモリー使用量を取得してみます。
各 MBean の Usage 属性にアクセスすると JSON 形式のデータが取得できるので、その value だけを取り出します。(MBean 名のスペースを %20 でエスケープする必要があります。)

MemoryPool の各 MBean から Non-Heap メモリー使用量を取得
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=class%20storage/attributes/Usage | jq ".value"
{
  "committed": "123015616",
  "init": "83521528",
  "max": "-1",
  "used": "80445056"
}

> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=JIT%20code%20cache/attributes/Usage | jq ".value"
{
  "committed": "268435456",
  "init": "268435456",
  "max": "268435456",
  "used": "11821088"
}

> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=JIT%20data%20cache/attributes/Usage | jq ".value"
{
  "committed": "8388608",
  "init": "0",
  "max": "402653184",
  "used": "8388608"
}

> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=miscellaneous%20non-heap%20storage/attributes/Usage | jq ".value"
{
  "committed": "117735420",
  "init": "94666748",
  "max": "-1",
  "used": "56731140"
}

同様に、java.lang:type=Memory MBean から、Non-Heap メモリーの使用量(NonHeapMemoryUsage 属性の値)を取得してみます。

java.lang:type=Memory MBean から Non-Heap メモリーの使用量を取得
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=Memory/attributes/NonHeapMemoryUsage | jq ".value"
{
  "committed": "517584356",
  "init": "446623732",
  "max": "-1",
  "used": "157152804"
}

当然のことではありますが、上記の結果から、java.lang:type=Memory MBean の NonHeapMemory 属性の値が、Non-Heap MemoryPool の全 MBean の Usage 属性を合計した値にほぼ等しいことが確認できます。

蛇足となりますが、jq の処理を修正すれば、used の値だけを抽出することも可能です。

used の値だけを取得
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=Memory/attributes/NonHeapMemoryUsage | jq ".value.used|tonumber"
154784708

ピーク値を取得する

MemoryPool の MBean には PeakUsage 属性があり、使用量のピーク値を取得することができます。(java.lang:type=Memory MBean には、ピーク値を示す属性が無いようです。)

以下は、java.lang:type=MemoryPool,name=miscellaneous non-heap storage MBean のピーク値を取得する例です。

ピーク値を取得
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=miscellaneous%20non-heap%20storage/attributes/PeakUsage | jq ".value"
{
  "committed": "180649980",
  "init": "77889532",
  "max": "-1",
  "used": "117278260"
}

終わりに

Liberty の REST コネクターを使用すると、Liberty の内部状態を MBean から取得したり、MBean のメソッドを実行することで様々な操作を行うことができます。
今回は、REST コネクターを使用して、Liberty の Non-Heap メモリー(Native メモリー)の使用量を取得してみました。この情報が何かのお役に立てば幸いです。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?