Java ParNew集合将对象移动到旧一代

Java ParNew集合将对象移动到旧一代,java,object,garbage-collection,Java,Object,Garbage Collection,这是我的VM参数: -XX:MaxPermSize=128m -XX:+UseParNewGC -XX:MaxNewSize=1G -XX:NewSize=1G -Xms13G -Xmx13G -XX:SurvivorRatio=128 -XX:MaxTenuringThreshold=0 -XX:+UseTLAB -XX:+UseConcMarkSweepGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

这是我的VM参数:

-XX:MaxPermSize=128m 
-XX:+UseParNewGC 
-XX:MaxNewSize=1G 
-XX:NewSize=1G 
-Xms13G 
-Xmx13G 
-XX:SurvivorRatio=128 
-XX:MaxTenuringThreshold=0 
-XX:+UseTLAB 
-XX:+UseConcMarkSweepGC 
-verbose:gc 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-Xloggc:./gc.log -cp
我还创建了内存泄漏:

{
    String s = "";
    for (int i = 0; i < objectsCount; i++)
        s += "s" + s;
}//Here all created objects should be garbage collected
我认为原因是,太多的对象同时被粘贴到内存中,所以垃圾收集器更方便地从年轻一代或老一代移动它们

我的问题是,我应该在参数中更改什么,以使小型GC清除所有这些对象?

在循环中移动字符串s=“”,然后重试


这里的问题是,直到for循环完成,变量s才被标记为GC。您看到的GC日志条目是在for循环进行时显示的。由于程序耗尽了年轻一代的空间,而for循环仍在运行,GC收集器将S的值移动到老一代,因为它不知道还能做什么


而不是这样做

String s = "";
for(int i = 0; i < counter; i++){
    s = s + "something";
}

根据需要调整烫发的大小。NewSize是您的年轻一代,剩余的堆分配给老一代。尝试一下,看看它是否对您有帮助。

让我为您解释一下JVM参数

-XX:NewSize=1G
-这是年轻空间的大小(使用“小”集合收集)

-XX:SurvivorRatio=128
-这将把年轻的空间分割为~1008 MiB的Enden+2个幸存者空间,每个空间8 MiB。当伊甸园被填满时,年轻的(“小”)收集就发生了

-XX:MaxTenuringThreshold=0
-此参数强制JVM立即将在一个年轻GC中幸存的对象升级到旧空间(因此从不使用幸存空间)。通常情况下,对象在升级到旧空间之前应该在几个“小”GC中生存,但您已经显式禁用了它

您可以在HotSpot JVM中找到有关分代收集的更多详细信息


可能也很有用。

“因为程序耗尽了年轻一代的空间,而for循环仍在运行,GC收集器将S的值移动到了老一代,因为它不知道还能做什么。”-是的,我能做些什么吗?因为在我的程序中,所有像这样的对象都将被标记为长时间变量,它们需要等待集合,集合将回顾旧一代。这就是我在回答中所说的。在循环内部而不是外部创建变量。检查我的回答中的编辑(int i=0;iString s = ""; for(int i = 0; i < counter; i++){ s = s + "something"; }
for(int i = 0; i < counter; i++){
    String s = "something";
    //call some methods to process it.
}
-d64 -server -Xms4096m -Xmx4096m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:NewSize=1536m -XX:MaxNewSize=1536m -XX:-UseAdaptiveSizePolicy -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseTLAB -XX:+UseConcMarkSweepGC -XX:+OptimizeStringConcat -XX:ParallelGCThreads=14 -XX:ConcGCThreads=14