美文网首页java面试
新生代和老年代

新生代和老年代

作者: 健倾心语 | 来源:发表于2018-12-31 17:41 被阅读5次

什么是堆:new出来的的对象都会存放在堆当中
堆内存分为两个区:(垃圾回收机制)
新生代:Eden,s0,s1
老年代:

刚new出来的对象存放在Eden区域中
新生代:刚创建对象,先存放在新生代
老年代:如果对象频繁被使用,对象放入老年代
s0,s1大小相同:为了来及回收机制的复制算法
垃圾回收机制需要经常去老年代进行垃圾回收吗?
垃圾回收机制主要是对新生代进行垃圾回收。

堆内存参数配置:
-XX:+PrintGC 每次触发日志的时候打印相关日志
-XX:+UseSerialGC 串行回收
-XX:+printGCDetails 打印更详细的GC日志
-Xms:堆初始值
-Xmx:堆最大可用值
-Xmn:新生代堆最大可用值
-XX:survivorRatio 用于设置新生代Eden空间和from/to空间比例

配置新生代和老年代的调优参数配置
-XX:survivorRatio = 2 Eden是from区(s0)或者to区(s1)的两倍
-XX:NewRatio = 2 设置老年区的内存大小为新生代去的两倍

总结:在实际应用中,我们可以直接将堆的初始值与堆的最大可用值相等,这样可以减少程序运行时垃圾回收的次数,从而提高效率

初始值越小,垃圾回收的次数就越多

堆溢出的解决方案:
java.lang.OutOfMemoryError:Java heap space 堆内存溢出

解决办法:
设置堆内存大小 :
-Xms1m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError(打印内存溢出错误信息)

在实际开发中,可以在Tomcat的catalina.sh文件中设置JVM的堆内存大小
JAVA_OPTS="-Server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"

栈溢出:产生于无限递归调用,循环遍历是不会的,但是循环方法里面产生递归调用,也会发生栈溢出。

解决办法:设置线程最大调用深度
设置 -Xss的大小。例如-Xss5m

相关文章

  • GC - 记忆集、卡表及写屏障

    记忆集与卡表 跨代引用 跨代引用是指新生代中存在对老年代对象的引用,或者老年代中存在对新生代的引用。 新生代引用老...

  • JVM调优总结 -Xms -Xmx -Xmn -Xss等

    首先介绍一下新生代、老年代。所谓的新生代和老年代是针对于分代收集算法来定义的,新生代又分为Eden和Survivo...

  • CMS、G1、ZGC的堆内存实现区别

    CMS CMS堆内存和以往的垃圾回收器一样,分为新生代和老年代,新生代和老年代是物理隔离的。 这些space必须是...

  • 垃圾回收算法

    为什么新生代和老年代用不同的回收算法?因为新生代的对象死的快,老年代都是在新生代经过15次gc存活下来的对象,一般...

  • 新生代和老年代

    什么是堆:new出来的的对象都会存放在堆当中堆内存分为两个区:(垃圾回收机制)新生代:Eden,s0,s1老年代:...

  • 万点五实现2

    堆分区 堆大小 = 新生代 + 老年代。默认下,新生代 ( Young ) = 1/3 的堆空间大小,老年代 ( ...

  • CMS和G1收集器的区别

    使用范围GMS是老年代收集器,可以配合Serial和ParNew等新生代收集器使用。G1是新生代和老年代收集器,不...

  • java:JVM总结

    JVM知识总结 新生代,老年代是啥? 是堆。新建的对象在新生代,对象活了很多次gc后,会进入老年代。 新生代为何有...

  • JVM 收集器之G1

    1、前言 传统的垃圾收集器将堆内存区域分为新生代和老年代,新生代又分为 Eden 区和 S(from、to)区,如...

  • JVM堆区新生代为什么有两个Survivor

    JVM内存模型中, Heap区被分为新生代和老年代两个区域, 新生代又分为Eden+Survivor1+Survi...

网友评论

    本文标题:新生代和老年代

    本文链接:https://www.haomeiwen.com/subject/isavlqtx.html