【问题标题】:Java to introduced the temporary objectsJava 引入临时对象
【发布时间】:2016-07-21 14:34:36
【问题描述】:

我看不到在我的应用服务器中触发了任何主要的 GC。这是因为,我分配了更多的内存,即 4GB。最大可达 1GB。我只想看到发生 Full GC。

要触发 Full GC,我需要填满堆内存,这在我的应用程序运行时是不可能的。因此,计划在启动服务器时放置一些临时对象并填充至少 3.5GB 的堆。

任何人都可以帮助我给我一些方法吗?

提前致谢

【问题讨论】:

  • Ermmm .... 使用new 分配一个大数组。或者分配一个列表并向其中添加大量元素。
  • 你想要完成什么?
  • @bradimus 我只想在我的应用程序服务器中发生完整的 GC,而不更改任何参数...
  • @StephenC 假设我创建了一个 1MB 的大型数组,其中有数千个对象。在这种情况下我需要创建多少个数组?
  • 堆被分成几个部分(年轻代和年老代)。对象根据它们的存活时间(它们保持可访问的时间)存储在这些部分中。当一个部分需要更多空间来存储对象并删除死对象时,就会发生 GC。被清除部分中的可达对象移动到下一个部分,而死对象则被认领。 AFAIK,仅当老年代需要更多空间时才需要完整的 GC。

标签: java performance garbage-collection jvm


【解决方案1】:

这里是临时对象创建的简单代码。希望对你有帮助。

for(int i=0;i<100000;++i){
map.put(UUID.randomUUID(),UUID.randomUUID());
}

将地图声明为全局变量,并在每个请求上执行此循环。

【讨论】:

    【解决方案2】:

    您可以通过以下方式从代码中触发 GC:System.gc() https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc()

    【讨论】:

    • 不保证做任何事情。不保证会触发 Full GC。
    • @StephenC 我同意你的看法。
    • 还有一件事是,在我的代码库中运行时我什至无法考虑放置这段代码。
    • System.gc() 和相关的 JNI 和管理 API 保证能够在具有特定设置的特定 JVM 上执行某些操作。 JRE API 无法保证这一点。因此,如果您不只是查看 JRE API(自 tag:jvm 起适用于此),那么如果您了解详细信息,建议您这样做是有效的。
    • @the8472 - 保证意味着“在官方 Oracle 文档中指定”。您所说的是已知适用于特定版本/设置的行为,但如果您更改设置或更新到新的补丁版本,则可能会停止工作。 (特别是关于gc() 是否会触发 >>full“如果你知道细节的话”对于大多数Java程序员来说是不现实的。
    【解决方案3】:

    你可以执行

    jmap -histo:live {pid}
    

    这将触发任何 Java 应用程序中的完整集合。

    【讨论】:

      【解决方案4】:

      这里是使用 visualVM 复制和测试上述场景的必要要点。

      https://gist.github.com/cooligc/eb9ba490e14a10d939147bd9c914afdd

      【讨论】:

      • 请编辑您的问题,而不是添加答案
      • 你想让我在@AlBlue这个问题中编辑什么?
      【解决方案5】:

      当 GC 被触发时,它只会清理你不再有权访问的对象(它们的引用指向 null); 因此,请确保在完成使用对象后将 null 分配给对象的引用

      SomeObject obj = new SomeObject();
        /*
           use obj
        */
        obj = null;
      

      这就是 GC 知道需要清理对象的方式。

      你也可以看看软引用和弱引用。

      【讨论】:

      • 我需要创建多少个对象并将它们引用到 null ?还有一件事,如果我将对象引用为 null,那么这将由 Minor GC 收集。如果它要进入 Tenured 那么它可以使用 Major GC 进行清理。
      • 您通常不必分配给 null。如果引用该对象的变量在方法中声明,并且没有其他变量引用该对象,则该对象将在方法结束后立即变得不可访问。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多