性能问答>为什么GC日志里新生代的大小比Xmn要小>
2回复

为什么GC日志里新生代的大小比Xmn要小



昨天发现了一个比较奇怪的现象,为什么明明设置了Xmn的具体大小,但是从GC日志看却比这个小,这是为什么呢

public class GCTest {
	public static void main(String args[]) {
		while(true) {
			byte[] b = new byte[1024];
		}
	}
}

JVM参数如下:

-Xmx200M -Xmn60M -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails

打印的GC日志如下:

[GC[ParNew: 49152K->265K(55296K), 0.0018670 secs] 49152K->265K(198656K), 0.0019080 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC[ParNew: 49417K->315K(55296K), 0.0012820 secs] 49417K->315K(198656K), 0.0013050 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
[GC[ParNew: 49467K->320K(55296K), 0.0013820 secs] 49467K->320K(198656K), 0.0014070 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
[GC[ParNew: 49472K->290K(55296K), 0.0014840 secs] 49472K->290K(198656K), 0.0015120 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 

从上面GC日志看,新生代的大小为55296K,而我设置了60M,这是为什么呢

4095 阅读
请先登录,再评论

新生代的大小应该是eden+form+to 的总大小,我按照你的参数试了下
eden space 49152K,
from space 6144K,
to space 6144K,加起来就是61440 也就是60M
而日志里打印的新生代大小应该是eden+一个survivor,也就是新生代可用的内存空间大小

2年前
回复 言风:

嗯,回答很对,这里确实是只算了eden+from,可以看下面的代码

void GenCollectedHeap::print_heap_change(size_t prev_used) const {
  if (PrintGCDetails && Verbose) {
    gclog_or_tty->print(" "  SIZE_FORMAT
                        "->" SIZE_FORMAT
                        "("  SIZE_FORMAT ")",
                        prev_used, used(), capacity());
  } else {
    gclog_or_tty->print(" "  SIZE_FORMAT "K"
                        "->" SIZE_FORMAT "K"
                        "("  SIZE_FORMAT "K)",
                        prev_used / K, used() / K, capacity() / K);
  }
}

其中capacity()的实现:

size_t DefNewGeneration::capacity() const {
  return eden()->capacity()
       + from()->capacity();  // to() is only used during scavenge
}
2年前回复