jvm中分为堆和非堆

堆 = 新生代-YoungGen(eden + survivor1 + survivor2) + 老年代-OldGen(tenured)

非堆 = 永久代-PermGen

在默认情况下,新生代 = 1/3的堆空间大小,老生代 = 2/3的堆空间大小

新生代被细分成Eden和两个survivor区域,这两个survivor区分别被命名为from和to。默认的Eden:from:to = 8:1:1

我们常见的配置,如下:

-Xms2000m -Xmx2000m -Xmn800m -XX:PermSize=64m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15

Xms表示jvm启动时的初始堆大小,Xmx为最大堆大小,Xmn为新生代的大小

PermSize为永久带的初始大小,MaxPermSize为永久代的最大空间

MaxTenuringThreshold为达到这个值,对象就会被移进老年代

基础的概念说完了,下面通过一个图来了解一下在jvm中创建一个新对象的时候完整的流程图

image

jvm每次都只会使用Eden和其中的一块survivor(可能是from,也可能是to)来为对象服务,所以无论什么时候,总是有一块survivor区域是空闲的。

GC分为两种:major GC和minor GC,老年代中采用标记-清除算法的Full GC(或称为Major GC),新生代中采用复制算法的Minor GC。新生代是GC收集垃圾的频繁区域。默认对象在survivor中每熬过15次Minor GC时,就会被晋升到老年代中。这个15是可以配置的。Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比进行一次Minor GC耗时更长。

在我们程序中,每次调用System.gc(),是先进行Minor GC,然后再进行Full GC

新生代-新创建的对象

老年代-经过多次Minor GC和Full GC回收,而没有被回收的对象或者大对象

永久代-jvm加载的类文件信息,常量,静态变量等

最后,总结一下jvm采用分代垃圾回收方式的原因:

1.Java程序在运行的时候,大多数对象在创建后很快就没有对象使用它了。

2.大多数一直在被使用的对象很少再去引用新创建的对象。

java gc 触发_Java GC种类和触发时机相关推荐

  1. java gc 时间_Java GC日志查看,GC日志时间分析

    Java中的GC有哪几种类型? 参数 描述 UseSerialGC 虚拟机运行在Client模式的默认值,打开此开关参数后, 使用Serial+Serial Old收集器组合进行垃圾收集. UsePa ...

  2. java gc 例子_Java GC.drawImage方法代码示例

    import org.eclipse.swt.graphics.GC; //导入方法依赖的package包/类 void paintElement(PaintEvent e) { GC g = e.g ...

  3. java textfield事件_java – 以编程方式触发JTextField中的键事件...

    >不要在JTextField上使用KeyListener只需添加ActionListener,当按下ENTER时会触发(感谢@robin 1获取建议) JTextField textField ...

  4. java触发full gc的几种情况概述

    前言 近期被问及这个问题,在此记录整理一下. System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full ...

  5. java 手动触发gc_java触发full gc的几种情况整理

    前言 近期被问及这个问题,在此记录整理一下. System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full ...

  6. java强制fullgc_触发Full GC执行的情况 以及其它补充信息

    除直接调用System.gc外,触发Full GC执行的情况有如下四种. 1. 旧生代空间不足 旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然 ...

  7. Java的ygc fgc_java基础—常用的GC策略,什么时候会触发YGC,什么时候触发FGC?

    一.内存回收策略和常见概念 常见内存回收策略可以从以下几个维度来理解: 1 串行&并行 串行:单线程执行内存回收工作.十分简单,无需考虑同步等问题,但耗时较长,不适合多cpu. 并行:多线程并 ...

  8. GC详解及Minor GC和Full GC触发条件总结

    GC,即就是Java垃圾回收机制.目前主流的JVM(HotSpot)采用的是分代收集算法.与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用.即:从gcroot开始 ...

  9. 触发Full GC执行的情况 以及其它补充信息

    除直接调用System.gc外,触发Full GC执行的情况有如下四种.1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然不足 ...

最新文章

  1. 2.5Gb/s混合集成光发射机
  2. SW6206超级华为快充5V5A,全协议OPPO闪充、自带电量计量、LED 灯/数码管显示
  3. OpenResty+Keepalived组建高可用集群+双主模式
  4. 多线程原来是这么简单
  5. boost::math模块计算贝塞尔函数的零点的测试程序
  6. 01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置
  7. Spring全家桶面试真题
  8. python用符号计算检验多维数组的计算
  9. 【图像处理】双边滤波算法(bilateral filter)和导向滤波算法(guided filter)
  10. [整理]WebUploader + SpringMVC 实现多文件断点续传之二 多文件断点续传
  11. 服务器上的VGA切换原理,什么是VGA接口 原理及特点是什么
  12. 此计算机无法连接道家庭组,无法加入家庭组怎么办
  13. Spring(11) - Introductions进行类扩展方法
  14. 隔离式DC/DC高压模块5V12V24V转50V110V250V300V380V600V1100V短路保护直流升压可调开关控制电源模块
  15. 解决 FileNotFoundError: [WinError 2] 系统找不到指定的文件
  16. SQL注入原理讲解,很不错!
  17. matlab卡农,又用Mathematica写了一段卡农
  18. python编写student类_Python艺术编程节——以趣味活动促进学生学习编程
  19. SpringBoot 偷懒小工具:项目种子生成器
  20. ffmpeg 解码本地裸视频流

热门文章

  1. lisp java_ai lisp java
  2. linux socketCAN通信,linux can 总线socket接口测试使用
  3. mysql统计各年龄段的数量
  4. 服务器工具个人免费版下载使用,xshell个人免费版,xftp个人免费版
  5. 微信小程序-当用户拒绝了位置信息的请求时,提醒用户去设置地理位置授权
  6. android 修改菜单大小,如何在NavigationView中更改菜单项图标的大小?
  7. php 本地mysql 代码_基于本地数据库的 IP 地址查询 PHP 源码
  8. 同软件多个线程设置不同ip_软件测试如何自学?收下这份《2020千锋性能测试入门视频教程》...
  9. python打包成apk界面设计_Stephen的SEM博客
  10. ps字体识别_PS字体包免费送:艺术+时尚+炫酷+复古等5000多款字体,由你来选择