【问题标题】:Is my memory enough?我的记忆力够吗?
【发布时间】:2018-01-18 03:45:54
【问题描述】:

我正在运行 Java 应用程序并收到此消息:

 Exception in thread "main" java.lang.OutOfMemoryError: Cannot allocate new BytePointer(1200): totalBytes = 3G, physicalBytes = 7G
    at org.bytedeco.javacpp.BytePointer.<init>(BytePointer.java:103)
    at org.nd4j.compression.impl.NoOp.compressPointer(NoOp.java:73)
    at org.nd4j.compression.impl.AbstractCompressor.compress(AbstractCompressor.java:131)
    at org.nd4j.compression.impl.AbstractCompressor.compress(AbstractCompressor.java:103)
    at org.nd4j.storage.CompressedRamStorage.store(CompressedRamStorage.java:68)
    at org.deeplearning4j.models.embeddings.loader.WordVectorSerializer.loadStaticModel(WordVectorSerializer.java:2638)
    at com.dl.SentimentClassifier.main(SentimentClassifier.java:76)
Caused by: java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes = 7G > maxPhysicalBytes = 7G
    at org.bytedeco.javacpp.Pointer.deallocator(Pointer.java:572)
    at org.bytedeco.javacpp.Pointer.init(Pointer.java:121)
    at org.bytedeco.javacpp.BytePointer.allocateArray(Native Method)
    at org.bytedeco.javacpp.BytePointer.<init>(BytePointer.java:95)

我的 Windows 笔记本电脑有 16G 内存,我在 Intellij 中将 Java 堆大小设置为:

-Xms128m
-Xmx10G
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow

消息是什么意思?我在想它说 Java 应用程序需要 7G 内存,而我的堆设置是 > 7G。如果是这样,为什么它会发送 OutofMemory 错误?

【问题讨论】:

标签: java intellij-idea heap-memory


【解决方案1】:

您正在混淆 IntelliJ IDEA JVM 选项和为您从 IntelliJ IDEA 启动的应用程序指定的 VM 选项。

您问题中的片段是 IntelliJ IDEA 的 .vmoptions 文件,它应用于运行 IntelliJ IDEA 本身的 JVM。

您自己的应用在不继承 IntelliJ IDEA JVM 的 VM 选项的单独 JVM 中运行。

可以在相应的Run/Debug configurationVM 选项字段中调整应用程序的 JVM 设置。

【讨论】:

  • 那么,我通常应该通过“运行配置”设置VM,而不是Intellij的VM配置吗?我通常应该为 Intellij 设置一个小的 VM 值,而为运行时配置设置一个更大的 VM 值(如果需要)吗?如何协调这两个值?
  • 这取决于你的项目的大小和你正在运行的代码的内存需求。如果 IntelliJ IDEA 抱怨内存不足或 IDE 性能低,您可以尝试使用 Help | 增加 IDE VM 选项。编辑自定义 VM 选项。您的应用程序的 VM 选项完全由您决定,并在运行/调试配置中设置。 IDE VM 选项不会以任何方式影响您的应用程序。
  • IDE怎么报内存不足?还抛出 OutofMemory 异常?如何区分?
  • IDE 将显示special dialog about low memory 并建议您增加-Xmx 的值。您的应用会在 Run 控制台中打印 OOM,所以这里不会出错。
  • 太棒了!还有一个后续问题,App VM 通常是通过“运行配置”选项设置的,还是通过 Java 代码的系统属性设置的?我猜它应该直接在代码中,这样在部署代码时,您不必将 VM 参数传递给“java ...”命令。对还是错?
【解决方案2】:

这意味着可能存在内存泄漏,这对我来说主要是因为一些本机库。为了更好地调试,您可以执行以下操作:

  1. 在运行进程之前监控内存,然后查看它如何随着进程执行而增长。

  2. 查看日志并检查执行路径,是否有大内存映射地址。

  3. 检查线程数是否膨胀。

  4. 考虑监控线程堆栈大小。

【讨论】:

    【解决方案3】:

    首先思考:为什么您的应用需要太多内存?在正常情况下,您是否成功运行了您的 java 应用程序?在那种情况下,java选项的配置是什么? (堆大小,GC,...)
    接下来,使用更大的最大堆大小重试。 (16G???)
    您需要检查的另一件事是:
    - 当前的 JVM:32 位还是 64 位?
    - 物理可用内存 RAM 和交换大小是否足以扩展?
    如果不是环境设置的问题,你需要仔细阅读你图书馆的文档。
    最后希望这个链接能帮到你Stackoverflow

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2018-06-25
      相关资源
      最近更新 更多