草庐IT

Java 进程内存远大于指定的限制

coder 2023-06-04 原文

我已经研究了大多数可用的方法来找出一个 java 进程真正使用了多少内存。 到目前为止,我可以说我知道分配的总内存可能是以下一项或多项:

  • 堆内存(应该由我的 -XX:MaxHeapSize=4096m 控制)
  • 永久内存(据说由我的 -XX:MaxPermSize=1024m 控制)
  • 保留代码缓存(应该由我的 -XX:ReservedCodeCacheSize=256m 控制)
  • N of Threads * Thread Size(假设由我的 -XX:ThreadStackSize=1024 控制)

但结果与 linux 告诉我的相差太大,我发现任何方法都可用于获取 java 进程的内存消耗。

在我的例子中,它是在 Ubuntu 11.10 x86_64 机器、JVM 1.6_u26 64 位和 ps -ALcf | 上运行的 Tomcat 实例。 grep org.apache.catalina.startup.Bootstrap | wc -l 告诉我我有 145 个线程或进程正在运行,它们都链接到同一个根进程(Tomcat)。

所有的总结应该给我总的最大内存 (4096MB) + (1024MB) + (256MB) + 145 * (1024KB) = 5521MB。 jmap -heap PID 告诉我什么,ManagementFactory.memoryMXBean.(heapMemoryUsage + nonHeapMemoryUsage).getCommitted() 告诉我什么,上面的理论值都是对的。

现在到 linux 方面,topnmon 都告诉我这个进程分配的 ResidentMemory 是 5.8GB -> 大约 5939,2MB。但我也知道这只是内存的一部分,是实时 RAM 内存中的一部分。 top 的 VIRT 和 nmon 的 Size(两者应该表示相同)告诉我进程是 7530MB(或者 nmon 准确地说是 7710952KB) . 这与预期的最大值相差太大:比最大值高出 2009MB,根据 jmap 和 jstat,堆内存分配甚至没有达到峰值(2048-OldSpace + 1534-Eden__Survivors)。

top 还告诉我代码堆栈是 36KB(公平,对于初始 catalina 启动器),数据堆栈是 7.​​3GB(代表其余部分)。

这个 tomcat 服务器实例是这台机器上唯一运行的一个,并且已经看到一些不稳定。需要每三天左右重新启动一次,因为机器有 7647544k RAM 可用,并且没有交换(出于性能原因)。我对限制进行了数学计算,并期望进程遵循它们,我发现为机器上运行的所有其他服务留出相当好的安全余量(除了 ssh 和 top 本身之外,这些服务都不应该打扰):7468 - 5521 = 1947。这对于“安全边际”来说几乎是太多了。

所以,我想了解所有这些内存从哪里使用,以及为什么不遵守限制。如果缺少任何信息,我很乐意提供。

最佳答案

Plain and simple the JVM uses more memory than what is supplied in -Xms and -Xmx and the other command line parameters.

这里是 very detailed article on how the JVM allocates and manages memory ,它并不像您在问题中的假设所期望的那么简单,值得全面阅读。

许多实现中的 ThreadStack 大小都有最小限制,这些限制因操作系统和有时 JVM 版本而异;如果您将限制设置为低于 JVM 或操作系统的 native 操作系统限制,则忽略线程堆栈设置(有时必须设置 *nix 上的 ulimit)。其他命令行选项的工作方式相同,当提供的值太小时,默认为更高的值。不要假设所有传入的值都代表实际使用的值。

类加载器和 Tomcat 不止一个,它们会占用大量不易记录的内存。 JIT 会占用大量内存,以空间换时间,这在大多数情况下是一个很好的权衡。

您引用的数字与我的预期非常接近。

关于Java 进程内存远大于指定的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10818356/

有关Java 进程内存远大于指定的限制的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  7. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  8. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  9. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  10. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

随机推荐