我正在尝试分析我的一个Java程序(使用Swing)中的内存泄漏,所以我下载了Eclipse MAT。
到目前为止我所做的:
它显示的是没有进程正在运行。它基本上看起来像这样:
图片来自此处:MAT:Eclipse没有显示任何正在运行的进程
根据SO上的大多数答案,您需要通过将参数设置为-jdkhome:[jdk安装的根文件]来配置HPROF jmap转储提供程序。
我已经这样做了。但是我仍然找不到任何正在运行的进程。如果有关系,我把我的JRE和我的JDK一起安装了,而不是单独安装。
如果您要的是堆转储,那么您可以使用%JAVA_HOME%/bin/jVisualvm. exe(JDK附带)对您的进程进行堆转储。然后,您可以使用MAT、jVisualvm或任何其他工具对其进行分析。
好的,显然这是一个更深层次、更根本的问题,与Windows中的文件夹权限有关。
据此,可能无法检测到本地应用程序的原因有两个:
解决方案:这可能发生在Windows系统上,这是由用于检测正在运行的应用程序的jvmstat技术配置错误引起的。有两种可能的原因:
>
%TMP%\hsperfdata_username文件夹权限不足-确保您能够在目录中创建文件并最终更新完整文件夹访问权限。或者,您可以重新创建文件夹,该文件夹应自动设置正确的访问权限。有关详细信息,请参阅此forums.sun.com线程。
在FAT磁盘上拥有%TMP%\hsperfdata_username文件夹-由于安全限制,默认情况下jvmstat在FAT磁盘上不起作用。您可以通过为VisualVM和受监控的应用程序设置-XX: ExpresBypassFileSystemCheck标志来绕过安全检查。有关详细信息,请参阅JDKbug#5042659。
这是因为(根据上面存档的这个线程):
你介意cd'***到TMP定义的目录,看看是否有一个名为hsperfdata_的目录,你的登录名在哪里。那是插桩缓冲区映射的目录(作为共享内存文件)。每次java进程启动时,它都应该在该目录中创建一个文件。
所以我从中理解的是,Java应该将文件写入%TMP%\hsperfdata_
因此,修复方法是为这个特定文件夹授予适当的权限。
对我来说,我发现MAT将错误org. eclipse.mat.SnapshotException:错误获取Java进程列表与'jps'.尝试配置一个JDKHPROF jmap提供程序
在路径MemoryAnalyzer-1.10.0.20200225-win32.win32.x86_64\mat\workspace\.元数据\.log
检查jps:open wincmd
和类型jps
返回jps不存在.
配置路径jps
到环境。