我在 Tomcat 下运行的 Java 应用程序遇到了一个非常奇怪的问题。
我们尝试在 1 周的冲刺中从新生成的新产品更新生产代码,该应用程序已经运行了几个月没有打嗝,然后这段新代码使我们的 Linux 服务器在一段时间后开始交换。
非常奇怪的是,当查看 VisualVM 的内存使用情况时,它从未超过最大堆大小,JVM 没有抛出 OutOfMemory,机器只开始交换,JVM 甚至在交换之后继续运行。
所以,似乎是从某处泄漏了内存,似乎是从新代码中泄漏的,但奇怪的是它不在 JVM 内部,关于如何调试它有什么想法吗?
谢谢!
最佳答案
交换不是泄漏的决定性指标。它是由低物理内存引起的。在 Linux 上使用 vmstat 获取交换使用情况。尝试使用不同的机器,试验配置——交换大小、物理内存大小、地址空间。
如果您确信问题出在您的程序中,请尝试以下操作:
估计您的程序应该使用的内存中值和峰值。您必须能够解释与这些指标的所有偏差。如果不能,请继续执行步骤 3。
假设您正确执行了第 1 步并且能够解释所有偏差,您就可以排除泄漏(对于如此含糊的建议感到抱歉,但调试与侦探一样好)。您现在应该专注于 GC 调优。首先,启用 GC 日志记录。查看您的堆是否真的已满,以及 GC 将大部分时间用于收集的位置。 This可能是开始优化的一个很好的起点。尝试查看调整 GC 选项是否有帮助。尝试使用收集算法、最大/最小堆大小、生成比率等进行试验。只有在排除泄漏后才进行试验(步骤 1)。
假设您正确执行了第 1 步并且无法解释所有偏差,您可以假设某处存在漏洞。使用内存分析器查看哪些对象对堆大小增长贡献最大。让探查器长时间运行——让你的程序处理一些它通常期望得到的请求,然后让它相对隔离。如果内存级别持续增长,则可能某处发生泄漏。如果不是,则可能不是内存泄漏。你能指出你程序中可能创建它们的部分吗?如果是,请尝试发送几个只针对程序的那部分的请求。它是否确定性地复制了问题?如果不是,请重复第 3 步。如果是,请使用分而治之并重新应用第 3 步,直到找到导致问题的类/方法。它也可以是多个部分的某种组合(这意味着它们单独看起来可能是无辜的,但它们在一起可能会形成一个辉煌的犯罪集团)。
希望这对您有所帮助,如果没有,请对我的帖子发表评论。
祝您运动愉快!
关于java - 调试奇怪的内存泄漏 - Java/Tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5984750/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/