我在一个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监视器的样子:
我正在尝试以编程方式分析hprof文件.在android-sdk中使用hprof-conv工具我生成了一堆com.your.package.index文件.
如何以编程方式解析这些.index文件?
我想在dominator树上运行一些自定义分析,这很容易通过MAT(Eclipse的Memory Analyzer)手动完成,但希望以自动方式完成.
我有一个大的(5GB)hprof转储,由应用程序在OutOfMemoryError发生时创建.(使用 XX:HeapDumpOnOutOfMemoryError).
不幸的是,发生此错误时没有收集日志.重新创建这将需要几个小时.我希望有些工具可以显示异常堆栈跟踪或来自hprof的所有线程堆栈等.
我目前正在使用MAT,无法看到获取线程信息的方法.我可以使用哪种工具?
(我不确定hprof文件是否有关于OOM发生时调用的线程/位置的信息).
(我知道在正常情况下如何进行线程转储.这里的麻烦就是已经发生的事件,我所拥有的只是hprof转储.)
如何使用OQL语法计算Eclipse MAT中的对象?这不起作用:
SELECT count(a) FROM org.hibernate.engine.EntityEntry a
WHERE (toString(a.entityName)="my.pojo")
(我想计算加载到内存中的hibernate pojos的数量)
必须有一个非常快速的方法...谢谢你帮助我!
我试图调查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
我试图使用Eclipse MAT(内存分析工具包)来分析一些相当大的堆转储(~2G).不幸的是我的笔记本电脑有32位Windows,并且MAT耗尽了1.4G分配堆的堆空间.我成功地从大型无头64位盒子上的命令行运行堆索引器.但是,我无法说服MAT从我的笔记本电脑上的目录导入这些索引文件,以便我可以交互地调查堆.我加载堆的所有尝试(与索引文件一起)导致MAT决定重新解析堆文件而不是使用现有索引.想法?
在我的应用程序中跟踪严重内存问题的过程中,我查看了我的应用程序中的几个堆转储,并且大多数时候我有一个我不知道的巨大位图.
它需要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应用程序.其中我试图首次使用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
我有一个堆转储,并且正在使用Eclipse MAT,尽管我认为这应该通过visualvm或任何OQL客户端来工作。
我们可以通过执行以下操作来选择类的所有实例的字段
select s.field1, s.field2 from org.me.MyClass
Run Code Online (Sandbox Code Playgroud)
...但这仅限于成员变量和带有实例的类型。
如何选择没有实例的类的静态字段?
这与另一个问题有关。
我已经下载了Eclipse MAT并尝试在 Windows 上启动它。
执行时MemoryAnalyzer.exe显示弹出窗口“不兼容的 JVM”,并显示以下消息:JVM 版本 1.8.0_242 不适合此产品。版本:需要11或更高版本。
正如本文档中所述,我创建了一个jre目录并复制了 OpenJDK 16,这解决了该问题。
但我觉得这个解决方案不是很优雅。所以我尝试-vm在 中添加参数MemoryAnalyzer.ini,并尝试创建一个eclipse.ini文件作为文档的参考。这不起作用!
有没有办法配置 JVM 的位置而不将其完全复制到 mat/jre 目录中?
MemoryAnalyzer.ini文件存在,而文档eclipse.ini引用了默认安装中不存在的文件。JAVA_HOME只是为了这个工具。我知道有一种方法可以从 MAT UI 获取线程详细信息等,但是有没有一种方法可以将这些堆栈(类似于线程转储)重定向到输出或运行任何 OQL 查询来获得相同的结果?
我们有相当大的 HeapDump(大约 16G),它显示了大约 500 个活动线程,并且通过 UI 遍历每个线程是一个繁琐的过程。想知道是否有办法通过 MAT OQL 从堆转储中获取简化的线程转储。
谢谢
维什瓦纳特