Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java引入了临时对象_Java_Performance_Garbage Collection_Jvm - Fatal编程技术网

Java引入了临时对象

Java引入了临时对象,java,performance,garbage-collection,jvm,Java,Performance,Garbage Collection,Jvm,我无法在我的应用服务器中看到任何主要GC被触发。这是因为,我分配了更多4GB的内存。它的最大容量将达到1GB。我只想看到一个完整的GC发生 要触发完全GC,我需要填满堆内存,这在我的应用程序运行时是不可能的。因此,计划在启动服务器时放置一些临时对象,并以至少3.5GB的容量填充堆 有谁能帮我找到办法吗 提前感谢您可以通过以下方式从代码触发GC:System.GC() 您可以通过以下方式从代码触发GC:System.GC() 当GC被触发时,它只清理您不再有权访问的对象(它们的引用指向null);

我无法在我的应用服务器中看到任何主要GC被触发。这是因为,我分配了更多4GB的内存。它的最大容量将达到1GB。我只想看到一个完整的GC发生

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

有谁能帮我找到办法吗


提前感谢

您可以通过以下方式从代码触发GC:
System.GC()

您可以通过以下方式从代码触发GC:
System.GC()

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

SomeObject obj = new SomeObject();
  /*
     use obj
  */
  obj = null;
这就是GC如何知道需要清理对象的原因


您还可以查看软引用和弱引用。

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

SomeObject obj = new SomeObject();
  /*
     use obj
  */
  obj = null;
这就是GC如何知道需要清理对象的原因

您还可以查看软引用和弱引用。

您可以执行

jmap -histo:live {pid}
这将触发任何Java应用程序中的完整集合。

您可以执行

jmap -histo:live {pid}

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

以下是使用visualVM复制和测试上述场景所需的要点


以下是使用visualVM复制和测试上述场景所需的要点


以下是创建临时对象的简单代码。希望它能帮助你

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

for(inti=0;i以下是创建临时对象的简单代码。希望对您有所帮助

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


用于(int i=0;iErmmm….使用
new
分配一个大数组。或者分配一个列表并向其中添加大量元素。您试图实现什么?@bradimus我只希望在我的应用程序服务器中实现一个完整的GC,而不改变任何参数…@StephenC让我们假设我已经创建了一个1MB的大数组,其中有数千个对象。H在这种情况下,我需要创建多少个数组?堆被划分为多个部分(年轻的和老的一代)。对象存储在这些部分中的时间取决于它们生存的时间(它们保持可访问的时间)。当一个分区需要更多空间来存储对象时,就会发生GC。清除分区中的可访问对象会移动到下一个分区,而死物会被声明。好的,只有在旧一代需要更多空间时,才需要完整GC。Ermmm…使用
new
分配一个大数组。或者分配一个列表添加大量元素。你想做什么?@bradimus我只想在我的应用服务器上完成一个完整的GC,而不改变任何参数…@StephenC让我们假设我已经创建了一个1MB的大数组,其中有数千个对象。在这种情况下,我需要创建多少个数组?堆被分成几个部分(年轻人和老年人)。根据对象存活的时间(可以到达的时间)将对象存储在这些区域中.GC发生在节需要更多空间来存储对象、移除死物的情况下。清除节中的可访问对象将移动到下一节,而死物将被声明。好的,只有当旧一代需要更多空间时,才需要完整GC。不保证做任何事情。不保证触发完整GC。@StephenC I同意你的看法。还有一件事是,在我运行的代码库中,我甚至无法考虑将此代码放入。
System.gc()
和相关的JNI和管理API保证在具有特定设置的特定JVM上执行某些操作。JRE API不保证这一点。因此,如果你进一步看JRE API(这在这里是适用的,因为标记:jvm)那么,如果您知道详细信息,那么建议是有效的。@8472-保证的意思是“在Oracle官方文档中指定”。您所说的是已知可用于特定版本/设置的行为,但如果更改设置或更新到新的修补程序版本,则可能会停止工作。(特别是关于是否
gc()的问题)
触发一个>>完全不保证做任何事情。不保证触发一个完全GC。@StephenC我同意你的观点。还有一件事,在我运行的代码库中,我甚至不能想把这个代码放进去。
System.GC()
和相关的JNI和管理API保证在具有特定设置的特定jvm上执行某些操作。JRE API并不保证这一点。因此,如果您只看JRE API(从tag:jvm开始适用于这里),那么如果您知道详细信息,建议您这样做是有效的。@8472-保证的意思是“在Oracle官方文档中指定”。您所说的是已知可用于特定版本/设置的行为,但如果您更改设置或更新到新的补丁版本,则可能会停止工作。(特别是关于是否
gc()的问题)
触发一个>>full我需要创建多少个对象并将它们引用为null?还有一件事,如果我将对象引用为null,则这将由次要GC收集。如果它将被保留,则可以使用主要GC清除。通常不必指定为null。如果引用该对象的变量在一个方法,没有其他变量引用该对象,一旦该方法结束,该对象将变得不可访问。我需要创建多少个对象并将它们引用为null?还有一件事,如果我将对象引用为null,那么它将由次要GC收集。如果它将被保留,那么它可以是c