当前位置: 首页 > 知识库问答 >
问题:

Grails应用程序占用更多内存?

通骁
2023-03-14

我目前正在Jetty中运行一个Grails应用程序。它运行良好,但占用的内存比我想要的多。

HTOP显示Jetty正在运行,如下所示:java-server-xmx256m-xms256m-xmn96m-xx:maxpermsize=64m-djetty.home=/home/...

在我看来,Jetty可能使用的最大内存应该是256+64=320 MB。相反,它看起来是这样的:

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 6256 jetty      20   0 2747M  623M 13732 S  0.0 31.3  1:28.06 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java -server -Xmx256m -Xms256m -Xmn96m -XX:MaxPermSize=64m -Djetty.home=...

显然,我不会期望内存使用量正好是320 MB,但难道不应该接近吗?为什么会是预期内存的两倍?如果有的话,那么当堆填满时,Java难道不应该拒绝分配更多的空间吗?

我试着详细了解jmap是怎么回事,但在我看来,一切都是正确的:

# jmap -heap 6256
Attaching to process ID 6256, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 268435456 (256.0MB)
   NewSize          = 100663296 (96.0MB)
   MaxNewSize       = 100663296 (96.0MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 67108864 (64.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 65208320 (62.1875MB)
   used     = 33343488 (31.798828125MB)
   free     = 31864832 (30.388671875MB)
   51.13379396984924% used
From Space:
   capacity = 17170432 (16.375MB)
   used     = 0 (0.0MB)
   free     = 17170432 (16.375MB)
   0.0% used
To Space:
   capacity = 18284544 (17.4375MB)
   used     = 0 (0.0MB)
   free     = 18284544 (17.4375MB)
   0.0% used
PS Old Generation
   capacity = 167772160 (160.0MB)
   used     = 132604224 (126.46124267578125MB)
   free     = 35167936 (33.53875732421875MB)
   79.03827667236328% used
PS Perm Generation
   capacity = 67108864 (64.0MB)
   used     = 55899320 (53.30974578857422MB)
   free     = 11209544 (10.690254211425781MB)
   83.29647779464722% used

26872 interned Strings occupying 2932096 bytes.

我以前在Jetty上运行过Grails应用程序,内存占用很少。刚刚检查了一个,它的内存占用了220 MB。所以我不确定我做错了什么。

共有1个答案

楚博雅
2023-03-14

JVM是一个本机程序,它消耗本机资源,包括本机内存。本机内存是运行时进程可用的内存,与Java应用程序使用的Java堆内存不同。每个虚拟化资源--包括Java堆和Java线程--都必须存储在本机内存中,以及虚拟机运行时使用的数据。
您还可以看看这个答案,它很好地解释了这个主题。
这个线程展示了一些如何使用Java泄漏本机内存的好例子。
Jetty文档也提到了这个主题。
如果您使用JDK7,您可以使用VisualVM buffer monitor插件来监视分配在垃圾收集堆之外的直接缓冲区。

 类似资料:
  • 问题内容: Tomcat 5.5.x和6.0.x Grails 1.6.x Java 1.6.x OS CentOS 5.x(64位) VPS服务器,内存为384M JAVA_OPTS:尝试了许多组合-包括以下内容 出口JAVA_OPTS =’-Xms128M -Xmx512M -XX:MaxPermSize = 1024m’ 导出JAVA_OPTS =’-server -Xms128M -Xmx

  • 为什么我的java PID占用更多内存。目前我有24GB ram和max-xmx=15G。所以java PID的解决方案是占用更少的内存。 23794 root 0 22.2g 16.5g 13416 s 100.070.42980:54上面的java是我的最高命令结果。任何人都知道如何重新关注这个问题。

  • 嗨,我对java编程还比较陌生。我编写的下面的程序似乎占用了很多内存(大约240 MB,正常吗?-我不这么认为!)请建议一些方法来优化这个程序,以便减少内存存储。 程序-- 代码-

  • 请帮助选择如何存储消息: 1) 2) SET似乎比LIST更容易使用,但Redis会在每条消息中存储字段名,从而使内存使用量增加一倍吗?

  • 问题内容: 有没有办法找出我的Java线程在虚拟机中占用多少内存? 例如,使用堆栈跟踪转储或其他某种方式。 问题答案: Java线程将堆用作共享内存。各个线程都有其堆栈(您可以通过-Xss命令行选项设置其大小,默认为512KB),但是所有其他内存(堆)都不属于特定线程,并询问一个特定线程仅使用了多少内存没有道理。

  • 首先,我的问题是,为什么编译线程占用大量的CPU,以及如何最小化这一点,以便我们可以将CPU分配给其他线程。 提前感谢!