⇧ がんの無い平和な世界が訪れて欲しいものですな。
『In Gandhara, Gandhara They say it was in India Gandhara, Gandhara 愛の国 ガンダーラ』と思わず「ガンダーラ(アーティスト:ゴダイゴ)」の曲の一節が思い浮かぶのであった。
By the way、結論として、表題の通り、結局「Eclipse Memory Analyzer」を使えていない情報なので、それでも構わない、お時間ある方のみご照覧ください。
「Java 仮想マシン(JVM:Java Virtual Machine)」のメモリー
Javaアプリケーションは、「Java 仮想マシン(JVM:Java Virtual Machine)」によって動作しているのだけど(多分...)、
⇧ あるマシンでメモリーは、「Java 仮想マシン(JVM:Java Virtual Machine)」以外にも利用されてはいますと。
stackoverflowの情報なので、正しい情報なのかは分かりませんが、
⇧「Java 仮想マシン(JVM:Java Virtual Machine)」が使用するメモリーの構成は上図のような感じらしい。
ただ、
⇧ Javaのバージョンによって、「Java 仮想マシン(JVM:Java Virtual Machine)」が使用するメモリーの構成が微妙に変わってくるらしい。
Eclipse Memory Analyzerとは
公式のドキュメントによると、
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.
⇧ とのこと。
Memory Analyzer (MAT)とは
公式のドキュメントによると、
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.
⇧ とのこと。
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)
⇧ う~む、ログの内容が役に立たな過ぎるんだが...
一応、
⇧ 上記サイト様の対応を行ってみたけども、エラー出るの変わらん...
stackoverflowの情報によると、
⇧ Eclipseのバージョンが合わないって仰ってる人が多いですかね...
「Eclipse Memory Analyzer」の公式のページで、
『This project is part of Eclipse IDE 2023-06, Eclipse IDE 2023-03, Eclipse IDE 2022-12, Eclipse IDE 2022-09, Eclipse IDE 2022-06, Eclipse IDE 2022-03, Eclipse IDE 2021-12, Eclipse IDE 2021-09, Eclipse IDE 2021-06, Eclipse IDE 2021-03, Eclipse IDE 2020-12, Eclipse IDE 2020-09, Eclipse IDE 2020-06, Eclipse IDE 2020-03, Eclipse IDE 2019-12, Eclipse IDE 2019-09, Eclipse IDE 2019-06, Eclipse IDE 2019-03, Eclipse IDE 2018-12, Eclipse IDE 2018-09, Eclipse Photon, Eclipse Oxygen, Neon, Mars, Luna, Kepler, Juno, Indigo, Helios, and Galileo.』
って記載の意味って...
無料で使わせてもらっているから文句は言えんけど、バグってるならバグってるでドキュメントでせめて一言ぐらい言及しておいて欲しいかな...
どうやら、ファイルを開かない状態であればエラーは出ないっぽい...そんな絶妙な使い方なんて分かるわけ無いやん...
というか、コーディングをできなくしてる時点で、駄目な気が...
⇧ Eclipseって相変わらずブラックボックス過ぎるんよな...
毎度モヤモヤ感が半端ない...
今回はこのへんで。