※当サイトの記事には、広告・プロモーションが含まれます。

Eclipse Memory Analyzerを使ってみようとしたけど...

nazology.net

⇧ がんの無い平和な世界が訪れて欲しいものですな。

『In Gandhara, Gandhara They say it was in India Gandhara, Gandhara 愛の国 ガンダーラ』と思わず「ガンダーラ(アーティスト:ゴダイゴ)」の曲の一節が思い浮かぶのであった。

By the way、結論として、表題の通り、結局「Eclipse Memory Analyzer」を使えていない情報なので、それでも構わない、お時間ある方のみご照覧ください。

Java 仮想マシンJVMJava Virtual Machine)」のメモリー

Javaアプリケーションは、「Java 仮想マシンJVMJava Virtual Machine)」によって動作しているのだけど(多分...)、

medium.com

⇧ あるマシンでメモリーは、「Java 仮想マシンJVMJava Virtual Machine)」以外にも利用されてはいますと。

stackoverflowの情報なので、正しい情報なのかは分かりませんが、

stackoverflow.com

⇧「Java 仮想マシンJVMJava Virtual Machine)」が使用するメモリーの構成は上図のような感じらしい。

ただ、

www.linkedin.com

www.linkedin.com

Javaのバージョンによって、「Java 仮想マシンJVMJava Virtual Machine)」が使用するメモリーの構成が微妙に変わってくるらしい。

Eclipse Memory Analyzerとは

公式のドキュメントによると、

projects.eclipse.org

The Eclipse Memory Analyzer™ provides a general purpose toolkit to analyze Java heap dumps. Besides heap walking and fast calculation of retained sizes, the Eclipse tool reports leak suspects and memory consumption anti-patterns. The main area of application are Out Of Memory Errors and high memory consumption.

https://projects.eclipse.org/projects/tools.mat

⇧ とのこと。

Memory Analyzer (MAT)とは

公式のドキュメントによると、

eclipse.dev

The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.

Use the Memory Analyzer to analyze productive heap dumps with hundreds of millions of objects, quickly calculate the retained sizes of objects, see who is preventing the Garbage Collector from collecting objects, run a report to automatically extract leak suspects.

https://eclipse.dev/mat/

⇧ とのこと。

Eclipse Memory AnalyzerとMemory Analyzer (MAT)、何が違うの?

で、

  • Eclipse Memory Analyzer
  • Memory Analyzer (MAT)

のどちらも似たような機能を提供してそうに見えるので、何が違うのかがいまいちハッキリしないのですが、「Memory Analyzer (MAT)」のページのサイドバーにある「About This Project」というリンクを押下すると、「Eclipse Memory Analyzer」のページに遷移することから、機能については同じってことですかね?

あれかな、Eclipseに同梱されてるかされていないかの違いってことなんだろうか?

混乱させてくれるよね~...

Eclipse Memory Analyzerを使ってみようとしたけど...

とりあえず、「Eclipse Memory Analyzer」のドキュメントの説明を見ると、

⇧ とあるので、よっぽど旧いEclipseを使っていないのであれば、Eclipseに同梱されてるっぽいので、「Eclipse Memory Analyzer」を使ってみる。

で、早速、ドキュメントでは、Eclipseの一部だという書きっぷりっだったので、てっきりEclipseに同梱されてると思いきや、同梱されておらんのだが...

致し方無いので、「Eclipse Memory Analyzer」をインストールします。

Eclipseを起動し、「ヘルプ(H)」>「Eclipse マーケットプレイス(M)...」を選択。

「検索」タブで、「Eclipse Memory Analyzer」と入力し、該当するものの「インストール」ボタンを押下。

「確認(c)>」ボタンを押下。

「完了(F)」ボタン押下。

Eclipseを再起動します。

再起動後、「ビュー」と「パースペクティブ」に「Eclipse Memory Analyzer」をインストールしたことによる追加項目が見られる。

「メモリー・アナライザー・ビュー」ってのが追加されている。

とりあえず、拡張子「.hprof」のファイルを取得する必要があるようです。

ただ、「パースペクティブ」で、「Eclipse Memory Analyzer」によって追加されたと思われる「メモリー分析」を選択するとエラーが出るという...

eclipse.buildId=4.23.0.I20220308-0310
java.version=17.0.2
java.vendor=Eclipse Adoptium
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=ja_JP
Framework arguments:  -product org.eclipse.epp.package.java.product -product org.eclipse.epp.package.java.product
Command-line arguments:  -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.java.product -data file:/C:/Eclipse-2022-03/workspace03/ -product org.eclipse.epp.package.java.product

org.eclipse.core.jobs
エラー
Wed Sep 06 21:16:49 JST 2023
内部エラーが発生しました: "選択からの Java AST の要求".

java.lang.NoSuchMethodError: 'boolean com.ibm.icu.text.UTF16.isSurrogate(char)'
	at org.eclipse.jdt.internal.ui.text.JavaWordFinder.findWord(JavaWordFinder.java:39)
	at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.updateOccurrenceAnnotations(JavaEditor.java:3300)
	at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.lambda$4(JavaEditor.java:3363)
	at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup.calculateASTandInform(SelectionListenerWithASTManager.java:175)
	at org.eclipse.jdt.internal.ui.viewsupport.SelectionListenerWithASTManager$PartListenerGroup$1.run(SelectionListenerWithASTManager.java:151)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

⇧「java.lang.NoSuchMethodError: 'boolean com.ibm.icu.text.UTF16.isSurrogate(char)」と言われてもね...

で、ログ見てみたけども、

!ENTRY org.eclipse.ui.workbench 4 2 2023-09-06 21:50:48.368
!MESSAGE プラグイン "org.eclipse.ui.workbench" からのコードの起動で問題が発生しました。
!STACK 0
java.lang.NoSuchMethodError: 'boolean com.ibm.icu.text.UTF16.isSurrogate(char)'
	at org.eclipse.jdt.internal.ui.text.JavaWordFinder.findWord(JavaWordFinder.java:39)
	at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.updateOccurrenceAnnotations(JavaEditor.java:3300)
	at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor$ActivationListener.windowActivated(JavaEditor.java:1216)
	at org.eclipse.ui.internal.Workbench$8.run(Workbench.java:1005)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.ui.internal.Workbench.fireWindowActivated(Workbench.java:1002)
	at org.eclipse.ui.internal.WorkbenchWindow$6.shellActivated(WorkbenchWindow.java:2459)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:92)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4243)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1063)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1087)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1072)
	at org.eclipse.swt.widgets.Decorations.WM_ACTIVATE(Decorations.java:1521)
	at org.eclipse.swt.widgets.Shell.WM_ACTIVATE(Shell.java:2314)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4743)
	at org.eclipse.swt.widgets.Canvas.windowProc(Canvas.java:340)
	at org.eclipse.swt.widgets.Decorations.windowProc(Decorations.java:1480)
	at org.eclipse.swt.widgets.Shell.windowProc(Shell.java:2286)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:5015)
	at org.eclipse.swt.internal.win32.OS.DestroyWindow(Native Method)
	at org.eclipse.swt.widgets.Control.destroyWidget(Control.java:782)
	at org.eclipse.swt.widgets.Shell.destroyWidget(Shell.java:732)
	at org.eclipse.swt.widgets.Widget.release(Widget.java:828)
	at org.eclipse.swt.widgets.Widget.dispose(Widget.java:425)
	at org.eclipse.swt.widgets.Decorations.dispose(Decorations.java:392)
	at org.eclipse.jface.window.Window.close(Window.java:335)
	at org.eclipse.jface.dialogs.Dialog.close(Dialog.java:988)
	at org.eclipse.ui.internal.statushandlers.InternalDialog.close(InternalDialog.java:651)
	at org.eclipse.jface.dialogs.Dialog.okPressed(Dialog.java:948)
	at org.eclipse.jface.dialogs.Dialog.buttonPressed(Dialog.java:468)
	at org.eclipse.ui.internal.statushandlers.InternalDialog.buttonPressed(InternalDialog.java:185)
	at org.eclipse.jface.dialogs.Dialog.lambda$0(Dialog.java:619)
	at org.eclipse.swt.events.SelectionListener$1.widgetSelected(SelectionListener.java:84)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:252)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4243)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1063)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4060)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3632)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1155)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)
	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:644)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:551)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:156)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1467)

!ENTRY org.eclipse.ui 2 2 2023-09-06 21:50:50.129
!MESSAGE Invalid property category path: org.springframework.ide.eclipse.beans.ui.properties.ProjectPropertyPage (bundle: org.springframework.ide.eclipse.xml.namespaces, propertyPage: org.springframework.ide.eclipse.beans.ui.namespaces.projectPropertyPage)

⇧ う~む、ログの内容が役に立たな過ぎるんだが...

一応、

androidfaq.w4c.work

⇧ 上記サイト様の対応を行ってみたけども、エラー出るの変わらん...

stackoverflowの情報によると、

stackoverflow.com

Eclipseのバージョンが合わないって仰ってる人が多いですかね...

Eclipse Memory Analyzer」の公式のページで、

『This project is part of Eclipse IDE 2023-06Eclipse IDE 2023-03Eclipse IDE 2022-12Eclipse IDE 2022-09Eclipse IDE 2022-06Eclipse IDE 2022-03Eclipse IDE 2021-12Eclipse IDE 2021-09Eclipse IDE 2021-06Eclipse IDE 2021-03Eclipse IDE 2020-12Eclipse IDE 2020-09Eclipse IDE 2020-06Eclipse IDE 2020-03Eclipse IDE 2019-12Eclipse IDE 2019-09Eclipse IDE 2019-06Eclipse IDE 2019-03Eclipse IDE 2018-12Eclipse IDE 2018-09Eclipse PhotonEclipse OxygenNeonMarsLunaKeplerJunoIndigoHelios, and Galileo.』

って記載の意味って...

無料で使わせてもらっているから文句は言えんけど、バグってるならバグってるでドキュメントでせめて一言ぐらい言及しておいて欲しいかな...

どうやら、ファイルを開かない状態であればエラーは出ないっぽい...そんな絶妙な使い方なんて分かるわけ無いやん...

というか、コーディングをできなくしてる時点で、駄目な気が...

Eclipseって相変わらずブラックボックス過ぎるんよな...

毎度モヤモヤ感が半端ない...

今回はこのへんで。