我已经研究了大多数可用的方法来找出一个java进程实际上使用了多less内存。 到目前为止,我可以说我知道分配的内存总量可能是以下一项或多项:
堆内存(据说由我的-XX控制:MaxHeapSize = 4096米)
永久内存(据说由我的-XX控制:MaxPermSize = 1024m)
预留的代码caching(据说由我的-XX控制:ReservedCodeCacheSize = 256m)
线程的数量*线程大小(据说由我的-XX控制:ThreadStackSize = 1024)
但是结果和linux告诉我的结果是不一样的,用我发现的任何方法都可以获得java进程的内存消耗。
在我的情况下,它是运行在Ubuntu 11.10 x86_64机器上的Tomcat实例,JVM 1.6_u26 64位和ps -ALcf | grep org.apache.catalina.startup.bootstrap | wc -l ps -ALcf | grep org.apache.catalina.startup.bootstrap | wc -l ps -ALcf | grep org.apache.catalina.startup.bootstrap | wc -l告诉我有145个线程或进程正在运行,全部链接到同一个根进程(Tomcat)。
这一切总结应该给我总(4096MB)+(1024MB)+(256MB)+ 145 *(1024KB)= 5521MB的最大内存。 什么jmap -heap PID告诉我,什么ManagementFactory.memoryMXBean.(heapMemoryUsage + nonHeapMemoryUsage).getCommitted()告诉我,上面的理论值都在配对上。
在windows中的Python程序内存
cachingDMA环境中的一致性问题
传递C char数组并分配导致程序崩溃
分析C应用程序中的最大内存使用情况 – linux
如何加快我的记忆扫描程序?
现在到linux端, top和nmon都告诉我这个进程分配的ResIDentMemory是5.8GB – >大概是5939,2MB。 但是我也知道这只是内存的一部分,在活RAM内存中的一部分。 VIRT top和大小nmon (都应该表示相同)告诉我的过程是7530MB(或正好7710952KB由nmon )。 这与预期的最大值不同: 超过最大值2009MB ,根据jmap和jstat,堆内存分配甚至没有达到峰值(2048-oldspace + 1534-Eden _ + _ Survivors)。
top还告诉我代码堆栈是36KB(对于最初的catalina启动程序是公平的),数据堆栈是7.3GB(代表其余的)。
这个tomcat服务器实例是这台机器上运行的唯一一个,并且一直在不稳定。 需要每三天左右重新启动一次,因为该机器有7647544k RAM可用,并且没有交换(出于性能原因)。 我做了math的极限,并期待过程遵循他们我看到这是一个相当不错的安全余量离开所有其他服务在机器上运行(这些都不应该打扰除了SSH和顶部本身):7468 – 5521 = 1947.对于“安全边际”来说,这几乎是太多了。
所以,我想知道所有的内存在哪里使用,为什么不遵守这个限制。 如果缺less任何信息,我将很乐意提供。
什么决定了一个进程可用的虚拟地址空间的大小?
移动内存页面比mremap()更快的方法?
poi阅读现有的excel和大数据编辑
监视subprocess的内存使用情况
如何在c中input/ x00内存地址?
简单而简单,JVM使用比-xms和-Xmx和其他命令行参数提供的内存更多的内存。
下面是关于JVM如何分配和管理内存的一篇非常详细的文章 ,它不像你期望的那样简单,根据你的问题的假设,这是值得全面阅读的。
在很多实现中,ThreadStack的大小有不同的最小限制,因 *** 作系统和有时JVM版本而异; 如果将限制设置为低于JVM或OS的本机 *** 作系统限制(有时必须设置ulimit on * nix),则将忽略该线程堆栈设置。 其他命令行选项的工作方式相同,默认情况下,当提供的值太小时默认为更高的值。 不要以为所有传入的值代表实际使用的值。
Classloaders和Tomcat有不止一个,吃掉很多没记录的内存。 JIT消耗了大量的记忆,为时间交易空间,这在大多数情况下是一个很好的交易。
你引用的数字非常接近我所期望的。
虚拟内存是使用的地址空间的数量,我不会太担心,因为你有一个64位的应用程序。 居民是实际使用的主存量。
你可以添加到你的列表
共享库,包括JVM。 〜0.5G
直接内存(0到4G)默认情况下,最大值与堆的最大值相同。
内存映射文件。 没有限制。
你可以做一个pmap来显示多少地址空间被用于什么目的。
顺便说一句:我有显示640G VIRT顶部由于内存映射文件的过程。 它可以比居民大小高得多。 ;)
总结以上是内存溢出为你收集整理的Java进程内存比指定的限制大得多全部内容,希望文章能够帮你解决Java进程内存比指定的限制大得多所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)