标签: eclipse-mat

Tomcat逐渐耗尽内存,部署了WebSocket应用程序

我在一个AWS盒子上运行Tomcat 8.5.9,部署了10个不同的WebSocket应用程序,每个应用程序基本上都充当了消息代理.https连接器正在使用Http11NioProtocol.我设置的唯一参数是maxThreads = 200以及证书信息.

请求量不是很高.它从周一早上开始运行,这是经理状态所说的:

最大线程数:200
当前线程数:38
当前线程忙:0
保持活动套接字计数:1
最大处理时间:234 ms
处理时间:17.254 s
请求计数:33351
错误计数:325
字节收到:0.00 MB
字节发送:34.07 MB

几天后,我注意到内存使用量继续增长.我必须每两周左右重启一次Tomcat服务,以防止出现OutOfMemoryException.

我一直在使用Eclipse MAT进行堆转储和分析,它始终指向WsFrameServer类是可疑问题.最新的转储显示以下内容:

5,146个"org.apache.tomcat.websocket.server.WsFrameServer"实例,
由"java.net.URLClassLoader @ 0x6c0047c28"加载,占用1,383,143,200
(73.13%)个字节.这些实例是从
"java.util.concurrent.ConcurrentHashMap $ Node []"的一个实例引用的.

Dominator Tree目前有106,000个条目,其中大部分是WsFrameServer类.

我做错了什么还是这个"正常"?Tomcat或连接器上是否有任何特定设置我应该设置以防止这种情况发生?

提前致谢.

编辑:我不确定这是否有用,但这是VisualVM监视器的样子:

VisualVM监视器

java memory tomcat websocket eclipse-mat

17
推荐指数
1
解决办法
1182
查看次数

以编程方式解析内存快照hprof索引文件

我正在尝试以编程方式分析hprof文件.在android-sdk中使用hprof-conv工具我生成了一堆com.your.package.index文件.

如何以编程方式解析这些.index文件?

我想在dominator树上运行一些自定义分析,这很容易通过MAT(Eclipse的Memory Analyzer)手动完成,但希望以自动方式完成.

android hprof eclipse-mat android-memory

10
推荐指数
1
解决办法
625
查看次数

是否可以在堆转储中查看来自hprof dump/threads的线程

我有一个大的(5GB)hprof转储,由应用程序在OutOfMemoryError发生时创建.(使用 XX:HeapDumpOnOutOfMemoryError).

不幸的是,发生此错误时没有收集日志.重新创建这将需要几个小时.我希望有些工具可以显示异常堆栈跟踪或来自hprof的所有线程堆栈等.

我目前正在使用MAT,无法看到获取线程信息的方法.我可以使用哪种工具?

(我不确定hprof文件是否有关于OOM发生时调用的线程/位置的信息).

(我知道在正常情况下如何进行线程转储.这里的麻烦就是已经发生的事件,我所拥有的只是hprof转储.)

java hprof heap-dump eclipse-mat

8
推荐指数
2
解决办法
8838
查看次数

用于计算匹配条件的对象的OQL语法

如何使用OQL语法计算Eclipse MAT中的对象?这不起作用:

SELECT count(a) FROM org.hibernate.engine.EntityEntry a 
WHERE (toString(a.entityName)="my.pojo")

(我想计算加载到内存中的hibernate pojos的数量)

必须有一个非常快速的方法...谢谢你帮助我!

java oql hprof eclipse-mat

7
推荐指数
1
解决办法
3419
查看次数

eclipse内存分析器看到整个堆转储的小部分(363,2MB)(8GB)

我试图调查java.lang.OutOfMemoryError: GC limit exceeded在tomcat中部署的Web应用程序的高负载下发生的情况.堆大小设置为8GB(-Xms2048m -Xmx8192m)

在某些时候,由于GC活动开销,我们的应用程序变得无法响应.我可以在日志中看到Full GC连续多次出现.所以我用以下命令(jmap -F -dump:format=b,file=/root/dump2.hprof 4963)进行了堆转储.包含dump的文件大小为9GB.在转储(app冻结约45分钟)后,发生了多个完整的GC直到OutOfMemoryError被抛出.

这是GC活动的对数样本

[Full GC [PSYoungGen: 932096K->875513K(1864128K)] [ParOldGen: 5592447K->5592447K(5592448K)] 6524543K->6467961K(7456576K) [PSPermGen: 112285K->112285K(262144K)], 12.3954040 secs] [Times: user=47.60 sys=0.43, real=12.39 secs]
[Full GC [PSYoungGen: 932096K->890562K(1864128K)] [ParOldGen: 5592447K->5592447K(5592448K)] 6524543K->6483009K(7456576K) [PSPermGen: 112285K->112285K(262144K)], 12.6131900 secs] [Times: user=48.45 sys=0.49, real=12.61 secs]
[Full GC [PSYoungGen: 932096K->895268K(1864128K)] [ParOldGen: 5592447K->5592447K(5592448K)] 6524543K->6487715K(7456576K) [PSPermGen: 112285K->112285K(262144K)], 12.9488670 secs] [Times: user=49.61 sys=0.46, real=12.95 secs]

Heap
 PSYoungGen      total 1864128K, used 896698K [0x0000000755560000, 0x0000000800000000, 0x0000000800000000)
  eden space 932096K, 96% …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection heap-dump eclipse-mat eclipse-memory-analyzer

7
推荐指数
2
解决办法
5383
查看次数

如何使用现有的Eclipse MAT索引进行交互式分析

我试图使用Eclipse MAT(内存分析工具包)来分析一些相当大的堆转储(~2G).不幸的是我的笔记本电脑有32位Windows,并且MAT耗尽了1.4G分配堆的堆空间.我成功地从大型无头64位盒子上的命令行运行堆索引器.但是,我无法说服MAT从我的笔记本电脑上的目录导入这些索引文件,以便我可以交互地调查堆.我加载堆的所有尝试(与索引文件一起)导致MAT决定重新解析堆文件而不是使用现有索引.想法?

memory heap analysis eclipse-mat

6
推荐指数
1
解决办法
1169
查看次数

如何实际查看从Android堆转储中获取的位图

在我的应用程序中跟踪严重内存问题的过程中,我查看了我的应用程序中的几个堆转储,并且大多数时候我有一个我不知道的巨大位图.

它需要9.4MB或9,830,400字节,或者实际上是每像素4字节的1280x1920图像.

我在Eclipse MAT中检查过它确实是一个字节[9830400],它有一个传入引用,它是一个android.graphics.Bitmap.

我想把它转储到一个文件,并尝试看到它.我无法理解它的来源.我所有绘图中最大的形象是640x960 png,不到3MB.

我试图使用Eclipse"将值复制到文件",但我认为它只是将缓冲区打印到文件中,我不知道任何可以读取字节流并将其显示为每像素4个字节的图像软件图片.

任何的想法?

这是我尝试过的:将字节数组转储到文件中,将其推送到/ sdcard/img,然后加载如下活动:

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        final File inputFile = new File("/sdcard/img");
        final FileInputStream isr = new FileInputStream(inputFile);
        final Bitmap bmp = BitmapFactory.decodeStream(isr);
        ImageView iv = new ImageView(this);
        iv.setImageBitmap(bmp);
        setContentView(iv);
        Log.d("ImageTest", "Image was inflated");
    } catch (final FileNotFoundException e) {
        Log.d("ImageTest", "Image was not inflated");
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有看到任何东西.

你知道如何编码图像吗?说它存储在byte[] buffer.buffer[0]是红色,buffer[1]是绿色等?

android bitmap eclipse-mat

6
推荐指数
1
解决办法
2435
查看次数

Eclipse:MAT错误

我正在开发一个Android应用程序.其中我试图首次使用MAT找出内存泄漏.我评论了以下链接.

链接

直到第3步它的工作.但是当我尝试运行第4步时,我在日食中遇到错误.错误日志是:

org.eclipse.core.runtime.CoreException: Plug-in "org.eclipse.mat.ui" was unable to instantiate class "org.eclipse.mat.ui.snapshot.editor.HeapEditor".
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:188)
at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)
at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:274)
at org.eclipse.ui.internal.registry.EditorDescriptor.createEditor(EditorDescriptor.java:235)
at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:318)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.createPart(CompatibilityPart.java:266)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor.createPart(CompatibilityEditor.java:61)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:304)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:857)
at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:119)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:333)
at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:254)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:102)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:71)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:53)
at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:949)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:633)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:735)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$2(PartRenderingEngine.java:706)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$7.run(PartRenderingEngine.java:700)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:685)
at …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks eclipse-mat eclipse-memory-analyzer android-memory

6
推荐指数
1
解决办法
203
查看次数

在OQL的堆转储中获取类的静态字段

我有一个堆转储,并且正在使用Eclipse MAT,尽管我认为这应该通过visualvm或任何OQL客户端来工作。

我们可以通过执行以下操作来选择类的所有实例的字段

select s.field1, s.field2 from org.me.MyClass
Run Code Online (Sandbox Code Playgroud)

...但这仅限于成员变量和带有实例的类型。

如何选择没有实例的类的静态字段?

这与另一个问题有关

java eclipse heap oql eclipse-mat

5
推荐指数
2
解决办法
3299
查看次数

Eclipse 内存分析器 - 不兼容的 JVM

我已经下载了Eclipse MAT并尝试在 Windows 上启动它。

执行时MemoryAnalyzer.exe显示弹出窗口“不兼容的 JVM”,并显示以下消息:JVM 版本 1.8.0_242 不适合此产品。版本:需要11或更高版本

正如本文档中所述,我创建了一个jre目录并复制了 OpenJDK 16,这解决了该问题。

但我觉得这个解决方案不是很优雅。所以我尝试-vm在 中添加参数MemoryAnalyzer.ini,并尝试创建一个eclipse.ini文件作为文档的参考。这不起作用!

有没有办法配置 JVM 的位置而不将其完全复制到 mat/jre 目录中?

  • 注意 1:文档似乎已经过时了。该MemoryAnalyzer.ini文件存在,而文档eclipse.ini引用了默认安装中不存在的文件。
  • NB 2:我不想改变我的JAVA_HOME只是为了这个工具。

java memory jvm out-of-memory eclipse-mat

3
推荐指数
1
解决办法
4504
查看次数

通过 MAT OQL 将线程堆栈写入文件

我知道有一种方法可以从 MAT UI 获取线程详细信息等,但是有没有一种方法可以将这些堆栈(类似于线程转储)重定向到输出或运行任何 OQL 查询来获得相同的结果?

我们有相当大的 HeapDump(大约 16G),它显示了大约 500 个活动线程,并且通过 UI 遍历每个线程是一个繁琐的过程。想知道是否有办法通过 MAT OQL 从堆转储中获取简化的线程转储。

谢谢

维什瓦纳特

java eclipse heap-memory out-of-memory eclipse-mat

0
推荐指数
1
解决办法
662
查看次数