【问题标题】:Limit Java Heap Space for play framework globaly在全球范围内限制 Play 框架的 Java 堆空间
【发布时间】:2011-10-09 11:00:18
【问题描述】:

我有一个非常旧的 linux 系统并安装了 java 和 play 框架。当我运行 java 时,我得到:

java -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

所以我在application.conf中限制了java堆空间:

jvm.memory=-Xmx256M -Xms256M

通过该设置,我可以运行游戏测试、游戏运行等......

但我不能跑:

play dependencies 
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

是否有一个全局配置文件或环境变量,我可以在其中限制游戏框架的全局 Java 堆空间?

更新: 以下也不起作用:

play dependencies -Xmx256M -Xms256M
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.1, http://www.playframework.org
~
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

更新 2

内存:

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 1024
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 38912
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

限制:

cat /proc/meminfo 
MemTotal:      4139312 kB
MemFree:        332988 kB
Buffers:        105252 kB
Cached:        1705644 kB
SwapCached:          4 kB
Active:        2566216 kB
Inactive:       625032 kB
HighTotal:      786432 kB
HighFree:         1728 kB
LowTotal:      3352880 kB
LowFree:        331260 kB
SwapTotal:     4192956 kB
SwapFree:      4168224 kB
Dirty:             368 kB
Writeback:           0 kB
Mapped:        1672180 kB
Slab:           570864 kB
CommitLimit:   6262612 kB
Committed_AS:  4075144 kB
PageTables:      19884 kB
VmallocTotal:   303096 kB
VmallocUsed:     10400 kB
VmallocChunk:   292648 kB

BR,

雷内

【问题讨论】:

  • 请注意,-Xmx/-Xms 表示使用的内存量,使用的内存总量会高得多。

标签: java playframework


【解决方案1】:

通常,您可以使用以下模式在调用 play 时指定 Java 命令行参数。

play run <appname> -Xmx256M -Xms256M

但是,查看play run 命令和play dependencies 命令的python 代码,它们以不同的方式调用Java。

play dependencies 命令调用 Java 时不通过 -X 命令(出于某种原因,它通过 -D 命令,但不通过 -X)。因此,除了编辑 framework/pym/play/commands 中的 deps.py 文件并将 -Xmx 和 -Xms 设置硬编码到此文件中之外,您无能为力。

这不是一个长期的解决方案,我建议您在 Play 上提出一张票,以允许从命令行或 application.conf 读取这些设置,但目前,我认为这种方法是您唯一的选择.

【讨论】:

  • 帖子已更新。我查看了python代码,现在可以准确地看到您的问题,
  • 谢谢,我对其进行了硬编码并创建了一张票。进化也是同样的问题:-(
【解决方案2】:

看来您运行的play 命令实际上是一个Python 脚本,它调用其他Play Framework python 模块,最终调用java 命令作为子进程。

查看the source code for the code that runsdependencies 命令,似乎没有任何逻辑可以加载环境变量或其他任何东西来将最大堆大小指定为-Xmx 参数。换句话说,Play 中调用此脚本中的 JVM 的 Python 代码无法指定默认的最大堆大小。

【讨论】:

    【解决方案3】:

    您的计算机没有足够的 RAM 来运行 Java。 Java 至少需要 64MB RAM。

    请注意,您无法通过将-Xms 指定给Java 来为您的计算机添加空闲内存:Java 无法将内存模块添加到您的主板。 -Xms 只是告诉 Java 要占用多少可用 RAM。如果失败(= 操作系统在 Java 尝试分配它时返回错误),您会收到上述错误。

    我的猜测是没有交换空间。查看cat /proc/meminfo 的输出。或者你有一个ulimit 设置限制每个进程可以分配多少内存(尝试ulimit -a 来检查)。

    【讨论】:

    • 查看更新 2。仍有交换空间,几乎 1 GB 内存用于缓存。
    • 这真的很奇怪。尝试调用java -version -Xmx32M(只有 32MB 甚至更少)。只要你不能启动java 本身,play 就不起作用。
    • 看我的回答。问题是,java 在容器中运行。
    【解决方案4】:

    在谷歌搜索更多之后,我发现了this 讨论。问题是,我的 Linux 系统在 openvz 容器中运行:

    Java 报错的原因是因为在启动时,它看到机器有超过 2 GB 的 RAM,所以它以服务器模式启动,尝试分配所有内存,然后失败,因为它位于 VPS 内。

    我可以通过更改 /usr/java/jdk1.6.0_26/jre/lib/i386/jvm.cfg 来解决 java 启动问题:

    -client IF_SERVER_CLASS -server
    -server KNOWN
    -hotspot ALIASED_TO -client
    -classic WARN
    -native ERROR
    -green ERROR
    

    到:

    #-client IF_SERVER_CLASS -server
    -client KNOWN
    -server KNOWN
    -hotspot ALIASED_TO -client
    -classic WARN
    -native ERROR
    -green ERROR
    

    现在我可以运行任何播放命令了。也许这有助于其他人遇到与基于容器的虚拟化相关的类似问题。

    BR,雷内

    【讨论】:

    • 哇,你是怎么知道的?你救了我的命:)
    • 我使用的是 VPS,但这并没有解决我的问题。 :(
    • +1 我在 citrix-something 上,所以这是最能帮助我的!
    • 较新的版本(在我的例子中是 x64 上的 1.7.0_40)似乎不再具有客户端 JVM。我想卡在服务器上。布默
    【解决方案5】:

    Play 似乎没有为依赖项甚至测试命令获取 jvm.memory 设置。强制它使用特定 JVM 设置的一种方法是使用 _JAVA_OPTIONS。

    例如:

    export _JAVA_OPTIONS="-Xms800m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m"
    play test
    

    play deps
    

    你应该看到

    ~        _            _ 
    ~  _ __ | | __ _ _  _| |
    ~ | '_ \| |/ _' | || |_|
    ~ |  __/|_|\____|\__ (_)
    ~ |_|            |__/   
    ~
    ~ play! 1.2.3, http://www.playframework.org
    ~ framework ID is test
    ~
    ~ Running in test mode
    ~ Ctrl+C to stop
    ~ 
    Picked up _JAVA_OPTIONS: -Xms800m -Xmx1500m -XX:PermSize=64m -XX:MaxPermSize=256m
    Listening for transport dt_socket at address: 8000
    

    请注意,这会将这些设置应用于在设置了 _JAVA_OPTIONS 的终端上运行的所有 java 程序。

    【讨论】:

    • 在Play 1.2.4中,环境变量好像是JAVA_OPTS
    • @itsadok:实际上,这似乎更像是 Java 运行时的事情,而不是特定于 Play 的事情。如果设置 _JAVA_OPTIONS 并运行“java -version”,您会看到设置已被拾取。
    • 我猜我们正在谈论两种完全不同的机制。我指的是this
    • Play 2.2.0 怎么样?
    • 设置这个给我“没有检测到java安装。请转到java.com/getjava并下载”错误。
    【解决方案6】:

    刚启动交互式 shell 时,我在运行 Fedora 并使用 Play 2.0 的笔记本电脑上遇到了这个问题。我发现构建脚本默认将内存值设置为相当高的值。

    为了解决这个问题,我必须编辑 $play_dir/framework/build 脚本并手动更改值,在脚本结束时它会执行以下操作:

    java ${DEBUG_PARAM} -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M ...
    

    只需相应地更改 -Xmx/-Xms 值(可能还有 permgen)。

    【讨论】:

    • 这正是我想要的。干杯
    【解决方案7】:

    我遇到了同样的问题。尝试将 --XX:MaxHeapSize 增加到更高的分配。这是我在 path/to/framework/build 中的配置

    java -Xms512M -Xmx1300M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -XX:MaxHeapSize=512m...
    

    【讨论】:

      【解决方案8】:

      在 Play 2.2 和 Java 7 中,这是我使用的。

      $ target/universal/stage/bin/foo -mem 256 -J-server
      

      -mem的详细介绍请看:

      $ target/universal/stage/bin/foo -h
      

      【讨论】:

        【解决方案9】:

        Play 无法识别 -XX 选项。而是使用 -DX。

        【讨论】:

          猜你喜欢
          • 2018-03-22
          • 2012-12-24
          • 2017-12-09
          • 1970-01-01
          • 2021-03-28
          • 2021-06-07
          • 2020-07-11
          • 2021-09-07
          • 1970-01-01
          相关资源
          最近更新 更多