jvm培训:为什么需要分代垃圾收集?

一步一步地标记和压缩Java虚拟机中的所有对象的效率非常低:分配的对象越多,垃圾收集所花费的时间就越长。但是,根据统计数据,大多数对象在很长一段时间内都不会有用。
  来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间)
  jvm培训

上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。
  JVM分代
  根据之前的规律,就可以用来提升JVM的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老年代,以及永生代。
  jvm培训

新对象将分配在年轻代内存中。一旦新一代的内存已满,它将开始为死对象启动所谓的小型垃圾回收过程。在一块新一代内存中,死亡越多,恢复过程就越快。至于仍然存在的对象,它们将在此时老化,最终它们将足够老,可以进入旧的内存。
  StoptheWorld事件-小型垃圾回收属于一个名为“StoptheWorld”的事件。发生此类事件时,必须暂停所有程序线程,直到事件完成为止(例如,所有恢复工作在此处完成)。
  晚年用来保存长寿的物体。通常,会设置一个阈值,并且当达到年龄时,年轻一代对象将移动到老一代。最终老一代也将被回收。该事件将成为主要MajorGC。
  主要MajorGC也将触发STW(停止世界)。通常,专业GC的速度要慢得多,因为它涉及所有活动对象。因此,对于响应式应用程序,应尽可能避免使用大型MajorGC。还要注意,主要GC的STW持续时间受旧式垃圾收集器类型的影响。
  永久生成包含JVM用来描述应用程序中的类和方法的元数据。永久生成由JVM在运行时根据应用程序使用的类填充。另外,JavaSE类库和方法也存储在这里。
  如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。
推荐阅读:JVM培训:JVM内存模型组成
如果你想了解更多关于java架构师的专业知识,可以加入JAVA架构师交流群:1037935907,里面都是同行,有资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值