我们如何借助 AppDynamics 捕获堆转储?
我正在使用 docker 来容器化我的应用程序,并希望从主机查看它的性能。我已经映射了卷:“/opt/tmp/my_app/:/tmp”,其中包含 hsperfdata_root
我一直在寻找我的应用程序中的内存泄漏和fhat与jhat,由于某种原因,枚举的实例保存在堆中.
为了模拟它,我已经在tomcat中部署了我的应用程序,稍微使用它,停止它并在tomcat上执行GC(通过jconsole).然后拿了一个heapdump发现了这个:
instance of x.mgbean.quote.Input$Tab@0xe0887c0 (16 bytes)
Class:
class x.mgbean.quote.Input$Tab
Instance data members:
name (L) : VEHICLE (24 bytes)
ordinal (I) : 0
References to this object:
java.util.HashMap$Entry@0xe15f7c0 (24 bytes) : field value
class x.mgbean.quote.Input$Tab (84 bytes) : static field VEHICLE
[Lx.mgbean.quote.Input$Tab;@0xe0887f0 (20 bytes) : Element 0 of [Lx.mgbean.quote.Input$Tab;@0xe0887f0
[Lx.mgbean.quote.Input$Tab;@0xe1541e8 (20 bytes) : Element 0 of [Lx.mgbean.quote.Input$Tab;@0xe1541e8
Run Code Online (Sandbox Code Playgroud)
知道怎么会这样吗?
如何在eclipse的断点创建一个dumpdump?
我的Java程序有2个版本,它们使用2种不同的方法来完成相同的任务。
其中一种方法遇到堆空间异常,而另一种则没有。
我可以通过设置VM参数-XX:+ HeapDumpOnOutOfMemoryError获得遇到错误的堆转储。
对于使用不会出错的方法的程序,我想在某个断点处获得一个堆转储。我怎样才能做到这一点?
我的Java程序在Linux平台上运行,并且经常崩溃;在这种情况下,我希望自动进行heapdump。
Java进程在Linux上命中“ OutOfMemory Error”时,是否有人有脚本/方法自动创建堆转储?
多谢您的协助。
从这个堆栈溢出的字符串对象数量,我开始知道如果我们做一些像:
String s = new String("ABC");
Run Code Online (Sandbox Code Playgroud)
然后我们objects在堆上有两个String,一个在constant池上"ABC",
但今天我拿了堆转储,发现堆上有两个objects它自己.我使用MAT工具同样请找到下面的屏幕截图.
所以我的查询是,如果堆上有两个对象,其中一个Char[]用于String类,另一个用于常量池,那么这意味着
String s = new String("ABC") 将总共创建3个对象.
生产中存在内存泄漏,GC日志低于此.很明显,你可以看到它是一个问题.但是,我无法获得堆转储,因为当我们发现它的问题已经太晚并且堆转储失败时(即使使用-F force选项).所以我试图找到一种方法来了解它何时会下降所以我可以进行堆转储.从这些日志中我能看到什么东西向我展示它几乎即将下降?谢谢!
Desired survivor size 134217728 bytes, new threshold 19 (max 31)
2430254K->1903326K(2490368K), 0.1973860 secs]
235738.331: [GC
Desired survivor size 134217728 bytes, new threshold 18 (max 31)
2427614K->1901667K(2490368K), 0.1901241 secs]
235752.709: [GC
Desired survivor size 134217728 bytes, new threshold 17 (max 31)
2425955K->1915547K(2490368K), 0.2188464 secs]
235761.054: [GC
Desired survivor size 134217728 bytes, new threshold 16 (max 31)
2439835K->1908633K(2490368K), 0.2318097 secs]
235772.360: [GC
Desired survivor size 134217728 bytes, new threshold 15 (max 31)
2432921K->1911872K(2490368K), 0.2773868 secs]
235785.063: [GC-- 2436160K->2479951K(2490368K), 1.1930829 secs] …Run Code Online (Sandbox Code Playgroud) 当JVM崩溃时,将在工作目录中创建堆转储文件(hs_err_pidXXXX.log).我想知道谁创建了这个文件.JVM崩溃意味着它已异常终止.所以它肯定不会创建这个文件.那么这个文件是如何创建的?
我们也可以控制此文件中显示的信息.如果我想在一个文件(hs_err_pidXXXX.log)中同时进行线程转储和堆转储,是否可能?如果有,怎么样?基本上我的优先事项是识别导致JVM崩溃并将其存储在创建的堆转储文件中的函数(或堆栈跟踪).
我的java应用程序的内存使用有问题.具有堆空间和非堆空间.现在我专注于我的堆空间.
我的应用程序是一个SocketServer,它通过DataInputStream获取Input.我正在读取信息作为字节数组.我每秒得到一个不规则的输入量,但我们说的是每秒400字节到1.000字节的空间,峰值可以更高.
由于我的程序是一个服务器,它在无限循环中等待输入.现在我遇到了问题,我的堆空间随着时间的推移而攀升,所有5-10分钟它会上升0.5MB.
我使用了多个监视器应用程序,如jconsole和YourProfiler.之后,我试图在Heap Dumps的帮助下弄清楚,我用jmap进行了解析并使用Eclipse Memory Analyzer进行分析.
现在我的问题是,在这个示例代码中,哪个选项更好或更少使用更少的堆空间1或2?
选项1:
while (true){
byte [] one= new byte [21];
do something with one;
byte [] two= new byte [50];
do something with two;
byte [] three= new byte [30];
do something with three;
}
Run Code Online (Sandbox Code Playgroud)
选项2:
byte [] one;
byte [] two;
byte [] three;
while (true){
one= new byte [21];
do something with one;
two= new byte [50];
do something with two;
three= new byte [30];
do something with three;
}
Run Code Online (Sandbox Code Playgroud)
我不知道在循环中创建的三个对象会发生什么.这些应该是局部变量,只能在循环中可见和访问.但是在一个循环圈之后,JVM会删除它们并在下一个循环中创建一个新循环.所以我猜应该没有内存泄漏? …
jmap可以知道每一代的大小,但是我想实时监视我的java进程。
使用jmx,MemoryMXBean.getHeapMemoryUsage().getUsed()可以获得总堆大小。但是我找不到任何获取方法:
heap-dump ×10
java ×8
heap-memory ×2
jvm ×2
appdynamics ×1
breakpoints ×1
docker ×1
eclipse ×1
enums ×1
java-8 ×1
jboss ×1
jmx ×1
jvm-crash ×1
linux ×1
loops ×1
memory-leaks ×1
performance ×1
string ×1