我们在linux中使用oracle jvm 1.8 64位。
我们知道jmap可以获得jvm堆转储:
jmap -F -dump:format=b,file=***filepath*** ***pid***
但是很慢。
我们知道通过JVisualVM和JConsolar连接到JMX也可以获得堆转储,而且非常快。但是他们有图形用户界面。
然而,在我们的产品环境中,没有GUI。没有一台有GUI的机器可以访问这个环境。
所以我们的问题是-JVisualVM和JConsole能否支持命令行进行堆转储?或者除了jmap之外,还有命令行方法来获取jvm堆转储吗?
我们今天试过了-
1.使用jvisualvm(远程jmx),我们可以成功地获得堆转储
2.使用不带-F选项的jmap时,转储失败:
[root@panda01~]#jmap-dump:format=b,file=/tmp/heapdump。31941.hprof 31941
31941:无法打开套接字文件:目标进程未响应或热点VM未加载
当目标进程没有响应时,可以使用-F选项
3、使用jmap with-F选项,转储成功,但速度慢:
[root@panda01~]#jmap-F-dump:format=b,file=/tmp/heapdump。31941.hprof 31941
正在连接进程ID 31941,请稍候。。。
调试器已成功连接。
检测到服务器编译器。
JVM版本是25.92-b14
倾倒堆到 /tmp/heapdump.31941.hprof...
创建堆转储文件
我们注意到结果(2.hprof文件)。使用jvisualvm的文件转储(称为第一转储)比使用jmap-F的文件转储(称为第二转储)小。使用jvisualvm查看,第一次转储中的实例数和大小远小于第二次转储中的实例数和大小。
使用jmap
而不使用-F
选项-这将是一种更快的方法。
答案中描述了差异。
请注意,如果没有-F
,jmap应该在与目标进程相同的用户/组下运行。
是否可以使用命令行中的JMX在linux(CentOS)上运行的进程上获取服务器堆转储? 无法打开VisualVM,无法安装jmap
问题内容: 我们有一个应用的公开测试版,偶尔会导致堆空间溢出。JVM通过休假来做出反应。 为了分析这一点,我想在内存出现故障的时候查看一下。Java不想让我这样做。该进程仍在内存中,但似乎未被视为Java进程。 有问题的服务器是Debian Lenny服务器Java 6u14 问题答案: 解决方案非常简单。我以root用户身份运行jmap,但必须以启动jvm的用户身份运行它。我现在要羞愧地隐藏我的
问题内容: jmap进行内存转储时,我的Java应用程序是否继续运行? 问题答案: 您的应用程序已停止。获得准确的堆转储的唯一实用方法是在创建转储时停止所有应用程序活动。 这是“简短”暂停还是“长时间”暂停取决于要转储多少。如果使用“ -dump”,则将转储整个堆,包括不可达的对象。如果使用“ -dump:live”,则只会转储可访问的对象……但这(至少)需要标记堆以找出可访问的对象。 但是,如果
问题内容: 是否有一个很好的方法来Map 获取和忽略案件? 问题答案: TreeMap扩展了Map并支持自定义比较器。 字符串提供默认的不区分大小写的比较器。 所以: 比较器不考虑区域设置。在其JavaDoc中阅读有关它的更多信息。
问题内容: 我有一个Struts2(2.1.8.1)Web应用程序。我的web.xml看起来像 它被配置为将所有请求映射到struts过滤器。我想在我的Web应用程序中添加一个servlet。我想将所有带有特定url模式的请求发送到该servlet。我希望其他所有内容都进入我的struts servlet。 我知道我只能将“ * .action”映射到struts servlet,但是我讨厌.ac
是否有任何工具可以转储旧一代的JVM堆? 换句话说,我如何判断一个物体是来自年轻一代还是老一代?