堆内存大小与jvm调优

堆内存太大,则gc时间过长。

堆内存太小,容易造成堆内oom。

堆内存太大,而系统内存不足时,容易触发堆外oom(java一些对象申请的是堆外地址,堆外地址默认和堆内地址一样大,受操作系统管理,以减少jvm对内存的影响)

堆内存足够用,但比较小,此时会频繁触发gc,每次时间教短。如果希望教短的响应时间,则堆内存小比堆内存大较好。

堆内存大容易触发堆外oom的原因:

堆外oom用于降低jvm对内存的影响,一些情况是为了避免gc,一些情况是提高io性能(减少堆内对外的反复复制),还有一些情况是为了线程共享(减少jvm复制)。

快速回顾一下堆内的GC机制,当新生代满了,就会发生young gc;如果此时对象还没失效,就不会被回收;撑过几次young gc后,对象被迁移到老生代;当老生代也满了,就会发生full gc。

堆外内存,在堆内实际仅仅保留堆外内存的基本信息(开始地址、大小和容量),所以这些对象很小,每撑过几次young gc后,就进入老生代,但又很难把老生代撑满,从而导致占用一大片堆外内存不释放,这就是堆内存大而导致堆外oom。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注