我们有一个应用程序可以生成新的JVM并代表我们的用户执行代码.有时那些内存耗尽,在这种情况下表现得非常不同.有时它们抛出OutOfMemoryError,有时会冻结.我可以通过一个非常轻量级的后台线程来检测后者,该线程在内存不足时停止发送心跳信号.在那种情况下,我们杀死了JVM,但我们永远无法确定未能获得心跳的真正原因是什么.(它也可能是网络问题或分段错误.)
可靠地检测JVM中内存不足情况的最佳方法是什么?
从理论上讲,-XX:OnOutOfMemoryError选项看起来很有希望,但由于这个错误,它实际上无法使用:https://bugs.openjdk.java.net/browse/JDK-8027434
捕获OutOfMemoryError实际上并不是众所周知的理由(例如,你永远不知道它发生在哪里),尽管它在很多情况下都有效.
剩下的情况是JVM冻结并且不会抛出OutOfMemoryError的情况.我仍然确定记忆是这个问题的原因.
有没有其他选择或解决方法?垃圾收集设置使JVM自行终止而不是冻结?
编辑:我完全控制了分叉和分叉的JVM以及在这些内部执行的代码,两者都在Linux上运行,如果有帮助,可以使用特定于操作系统的实用程序.
我在域模式下运行JBoss Wildfly 8.1.0.Final,有两个节点("host-1"和"host-2"),需要从一个节点向集群中的所有节点发送消息才能执行对所有人采取某种行动.发送消息的客户端和消息接收者应该在同一个EAR中.
由于这个问题到目前为止还没有得到答复和解决,我将把问题分解为更简单的部分.请随时回答或评论一个子集,以便我进一步调查.
假设这是消息驱动bean的有效用例,我是否正确?如果没有,为什么?在这种情况下,问题的其余部分可能毫无意义.
我创建了一个javax.jms.Topic在domain.xmlJBoss的集群的域控制器的"主机1".原则上正确吗?
打算发送消息的客户端通过JNDI 查找Topic和查找ConnectionFactory(而不是例如注入它).这是正确的方法吗?
要接收消息的MDB配置为Topic通过a 监听@ActivationConfigProperty.正确?
上述设置在本地工作,即消息仅由发送它的节点接收.其他节点不接收它.发送消息的客户端代码是从WAR触发的,并且消息由同一EAR中的EJB模块中的MDB接收.
我不确定我们是否需要一个RemoteConnectionFactory或者我们是否需要使用不同的方式来查找主题(当前注入MDB并由客户端查找java:/jms/rmcTopic),因为它实际上是在远程主机上定义的.
这是我在domain.xml中的主题.我知道<clustered>标签已弃用,但我找不到最近的文档,说明如何使用Wildfly 8.1完成此操作.
<subsystem xmlns="urn:jboss:domain:messaging:2.0">
<hornetq-server>
<clustered>true</clustered>
<cluster-user>hornetqcluster</cluster-user>
<cluster-password>hornetqcluster</cluster-password>
<!-- ... -->
<jms-connection-factories>
<!-- ... -->
<connection-factory name="RemoteConnectionFactory">
<connectors>
<connector-ref connector-name="http-connector"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
</entries>
</connection-factory>
</jms-connection-factories>
<!-- ... -->
<jms-destinations>
<!-- ... -->
<jms-topic name="rmcTopic">
<entry name="java:/jms/rmcTopic"/>
</jms-topic>
</jms-destinations>
</hornetq-server>
</subsystem>
Run Code Online (Sandbox Code Playgroud)
MDB在EAR中打包为EJB模块,MDB注释为:
@MessageDriven(name = "ConfigurationMDB", activationConfig = {
@ActivationConfigProperty(propertyName …Run Code Online (Sandbox Code Playgroud)