垃圾回收指的是对 jvm堆内存的回收。

一. java虚拟机栈

二、本地方法栈(Native Method Stack)

  本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。

  不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,因此不同的虚拟机实可以进行自由实现,我们常用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈。

局部变量表 (是一组变量值存储空间,用于存放方法参数方法内定义的局部变量。)

操作数栈(其实就是个临时数据存储区域,通过入栈出栈 来进行计算的) 工作原理图

堆内存模型图如下: 包括 年轻代、 老年代(年轻代又分为 伊甸区 , 存活区0  存活区1)   可以看出 如果堆内存总共是3GB, 新生代 : 老年代内存默认占比为 1GB:2GB, 而伊甸区 和 2个存活区的默认占比是8 :1 :1

讲一件jvm的垃圾回收策略, 标记清除。

新生代, 垃圾回收,  是monitor gc, 简称小gc,什么时候触发monitor-gc呢?

一般创建的对象都会存入 年轻代 , 有的会存入老年代(后面会讲)

jvm有mark算法,知道那些是标记存货对象, 这些存活对象不会被清理,伊甸区90%都是垃圾,清理伊甸区之前会将伊甸区的存活对象复制到存活区s0,然后sweep扫掉伊甸区的所有对象(所以比较快。一扫而尽)。

当伊甸区满了以后,就开始重复上面的动作, 回收年轻代的垃圾。

什么时候触发full-gc?

jvm垃圾回收策略之标记清除图解:

《深入理解Java虚拟机》GC详解及Minor GC和Full GC触发条件总结
https://blog.csdn.net/wyl_1483061559/article/details/82726128JVM调优目标:使用较小的内存占用来获得较高的吞吐量或者较低的延迟Java虚拟机--垃圾收集器--CMS收集器
CMS(Concurrent Mark Sweep)remark意思是标记的有意思, 收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非常符合这类应用的需求。从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于标记-清除算法实现的java中堆和栈有什么区别?  https://blog.csdn.net/weixin_38719347/article/details/80889505
java中堆和栈属于不同的内存区域,使用目的也不同.
java虚拟机栈(注意区别于本地方法栈 Native Method Stack)常用于存储栈帧(栈帧包含:1.局部变量区 2.操作数栈 3.帧数据区 ), 而对象总是在堆上分配.
栈通常都比较小,也不会在多个线程之间共享,而堆被整个JVM的所有线程共享.JVM内存模型: 运行时数据区包含如下:
方法区(包含运行时常量池)  堆  所有线程共享的
虚拟机栈 本地方法栈  程序计数器(这个不会发生内存溢出,其它几个都会)  线程不共享, 即都是是线程隔离的,即每个线程都有自己独立的虚拟机栈。https://blog.csdn.net/mine_song/article/details/71517200每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,
这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等。
Java栈的组成元素——栈帧, 栈帧由三部分组成:在Java虚拟机规范中,Java栈(Java Stack)也可以被称之为Java虚拟机栈(Java Virtual Machine Stack),
Java栈主要用于存储栈帧(Stack Frame),也就是说栈帧是Java虚拟机栈的组成元素
而栈帧中则负责存储局部变量表、操作数栈、动态链接和方法返回值等信息。1.局部变量区、
2.操作数栈(操作数栈其实就是个临时数据存储区域,它是通过入栈和出栈来进行操作的,如100+98  为100入栈 98入栈,计算出198出栈,赋值给局部变量区的第三个)、
3.动态链接和方法返回值等虚拟机栈 和 本地方法栈 的区别?  https://blog.csdn.net/weixin_42414212/article/details/114072750
一、虚拟机栈(VM Stack)
1.1)什么是虚拟机栈虚拟机栈是用于描述java方法执行的内存模型。每个java方法在执行时,会创建一个“栈帧(stack frame)”,栈帧的结构分为“局部变量表、操作数栈、动态链接、方法出口”几个部分(具体的作用会在字节码执行引擎章节中讲到,这里只需要了解栈帧是一个方法执行时所需要数据的结构)。我们常说的“堆内存、栈内存”中的“栈内存”指的便是虚拟机栈,确切地说,指的是虚拟机栈的栈帧中的局部变量表,因为这里存放了一个方法的所有局部变量。方法调用时,创建栈帧,并压入虚拟机栈;方法执行完毕,栈帧出栈并被销毁
二、本地方法栈 Native Method Stack 功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法i=1在内存怎么分配,基本数据类型, 进入栈保存.jvm参数主要有哪几种分类?
1.以- 开头的是    标准参数   java -version; java -help; java -jar
2.以-X 开头的是   非标准参数  在将来的jvm版本中可能会发生变化  如-Xms:初始堆大小
3.以-XX 开头的是  不稳定参数  主要用于jvm调优和debug  如-XX:NewRatio:设置新生代和老年代的比 此类参数设置合理可以大大提高JVM的性能及稳定性young Generation
tenured generation(老年代简称tenured gen) Full GC相对于Minor GC来说,停止用户线程的STW(stop the world)时间过长,至少慢10倍以上,所以要尽量避免讲一讲对象的分配规则:  同时也就讲了Monitor GC(Eden区分配不够时进行一次Monitor GC) 和 Full GC的触发条件(1.调用System.gc  2.老年代空间不足 )
1.对象优先分配在Eden区,如果Eden区没有足够的空间,虚拟机进行一次Monitor GC
2.大对象直接进入老年代(大对象是指需要大量内存空间的对象).这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存copy(新生代通过复制算法收集内存)
3.长期存活的对象进入老年代(即从Eden区和Survivor区通过mark标记选中复制多次到Survivor区,年龄大的),虚拟机为每个对象定一个年龄计数器,如果对象经过了1次Monitor GC 那么对象会进入Survivor区,之后每经过一次Monitor GC那么对象的年年龄加1,直到达到阈值(默认是15),对象进入老年代
4.动态判断对象的年龄.如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代.5.空间分配担保    -XX:HandlePromotionFailure:true/false   是否设置空间分配担保  JDK7及以后这个参数就失效了。只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MinorGC,否则FullGC。HotSpot中空间分配检查的代码片段
bool TenuredGeneration::promotion_attempt_is_safe(size_t
max_promotion_in_bytes) const {// 老年代最大可用的连续空间size_t available = max_contiguous_available();  // 每次晋升到老年代的平均大小size_t av_promo  = (size_t)gc_stats()->avg_promoted()->padded_average();// 老年代可用空间是否大于平均晋升大小,或者老年代可用空间是否大于当此GC时新生代所有对象容量bool   res = (available >= av_promo) || (available >=
max_promotion_in_bytes);return res;
}不稳定参数分为3类:
1.性能参数:用于JVM的性能调优和内存分配控制,如内存大小的设置
2.行为参数:用于改变JVM的基础行为,如GC的方式和算法的选择  如-XX:+UseG1GC
3.调试参数: 用于监控.打印,输出jvm的信息.https://www.cnblogs.com/leeego-123/p/11572786.htmljava -server
-Xms4G
-Xmx4G
-Xmn2G
-XX:NewRatio=2
-XX:SurvivorRatio=1
-XX:PretenureSizeThreshold=<字节大小>  默认值是0,意味着任何对象都会先在新生代分配内存,该参数可以设分配到新生代对象的大小限制 任何比这个大的对象都不会尝试在新生代分配,将直接在老年代分配内存。典型的大对象就是很长的字符串或者数组,它们在被创建后会直接进入老年代,这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存复制(新生代采用复制算法)
-XX:PermSize=20M      设置方法区的初始大小
-XX:MaxPermSize=30M   设置方法区的最大值
-XX:+UseConcMarkSweepGC  意思是使用CMS垃圾回收器   (Concurrent Mark Sweep)回收器是在最短回收停顿时间为前提的回收器,属于多线程回收器,采用标记-清除算法。
-XX:MetaspaceSize=128M  https://blog.csdn.net/u011069294/article/details/107393331JVM方法区(元空间)大小设置(-XX:MetaspaceSize和-XX:MaxMetaspaceSize)方法区跟Java堆一样,也是线程共享的区域,它用于存储虚拟机加载的类、常量、静态变量、即时编译器编译后的代码等数据,常量池即在方法区存在在JDK1.8开始有了元空间区(Matespace)来替换永久代(Permanent Generation),Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关超过这个值就会引发Full GC,这个值不是固定的,是会随着JVM的运行进行动态调整的,与此相关的参数还有多个,详细情况请参考这篇文章jdk8 Metaspace 调优-XX:HandlePromotionFailure:true   是否设置空间分配担保  JDK7及以后这个参数就失效了。只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MinorGC,否则FullGC。1.堆设置
-Xms4G 是指: JVM启动时整个堆(包括年轻代,年老代)的初始化堆内存。  初始堆大小 默认为内存的(1/64)
-Xmx4G 是指: JVM启动时最大堆内存。    最大堆大小 默认为内存的(1/4)
-Xmn2G 是指: 新生代的内存,剩下的是年老代的内存大小, 值等于-Xmx减去-Xmn
-XX:NewRatio=2   年轻代/老年代  年轻的:老年代为 1:2
-XX:SurvivorRatio=1  是指:年轻代空间中2个Survivor空间与Eden空间的大小比例。此处为1:1:1,算法如下:比如整个年轻代空间为2G,如果比例为1,那么2/3,则S0/S1/Eden的空间大小是同样的,为666M。该值不设置,则JDK默认为比例为8,那么是1:1:8,通过上面的算法可以得出S0/S1的大小。我们可以看到官方通过增大Eden区的大小,来减少YGC发生的次数,但有时我们发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时stop-the-world的时间较长,因此需要按照程序情况去调优。
-XX:MetaspaceSize=128M   2. 收集器设置
-XX:+UseConcMarkSweepGC 是指:使用CMS垃圾回收器。JDK1.7以后推荐使用G1垃圾收集器(Garbage First) -XX:+UseG1GC

jvm垃圾回收策略之标记清除相关推荐

  1. 垃圾回收只知道标记清除?一文帮你打通V8垃圾回收

    前言 本文旨在帮你建议起垃圾回收的体系化知识,仔细品味目录,相信你能体会得的到. V8 垃圾回收核心思路 第一步 通过 GC Root 标记活动对象与非活动对象 如何判断活动对象? V8 通过 可访问 ...

  2. 垃圾回收之垃圾回收算法(标记清除、标记整理、复制)、分代垃圾回收

    2. 垃圾回收算法 之前我们学习了如何判断一个对象是不是可以作为垃圾被回收,但是具体回收还需要依赖一些回收方面的算法,常见的有三种: 分别是标记清除.标记整理.和复制这三种算法,下面先从第一种标记清除 ...

  3. 垃圾回收机制之标记清除算法

    这个时候我来讲一下垃圾回收策略,主要分为这几种1. 标记清除算法就相当于给一个对象做一个标记,怎么做标记呢,其实是这样做标记的,比如举个例子,这个地方假如是堆内存,比如你创建一个对象的时候,User ...

  4. 垃圾回收算法|GC标记-清除算法

    本文是<垃圾回收的算法与实现>读书笔记 什么是GC标记-清除算法(Mark Sweep GC) GC 标记-清除算法由标记阶段和清除阶段构成.在标记阶段会把所有的活动对象都做上标记,然后在 ...

  5. JVM垃圾回收器-CMS并发标记清除

    Java8的CMS垃圾回收器官方文档参考:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html#con ...

  6. JVM分代垃圾回收策略的基础概念

    JVM分代垃圾回收策略的基础概念 由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为 ...

  7. jvm垃圾回收机制_深入理解JVM的垃圾回收机制

    ​如何判断对象已"死" Java堆中存放着几乎所有的对象实例,垃圾回收器在堆进行垃圾回收前,首先要判断这些对象那些还存活,那些已经"死去".判断对象是否已&qu ...

  8. java 虚拟机 Java内存结构 JVM垃圾回收机制算法

    什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 但不一定所有人都知道的是, ...

  9. JVM垃圾回收算法和回收器

    一.垃圾回收算法: 1.引用计数法 引用计数法就是对于一个对象A,只要有任何一个对象引用了A,则A的计数器就加1,当引用失效时就减1.只要对象A的计数器数值为0,将会被回收. 注意:无法处理循环引用的 ...

最新文章

  1. Android游戏开发基础part2--Canvas画布
  2. pandas从dataframe中删除一个或多个数据列
  3. Svg.Js A标签,链接操作
  4. Android--DPAD键的事件处理
  5. Matlab的File菜单功能图解 - 导入数据、保存工作空间、搜索路径、系统参数
  6. MCU,RTOS,物联网之间的关系。
  7. tar (child): lbzip2: Cannot exec: No such file or directory 解决方法
  8. Atitit 健康减肥与软件健康减肥的总结 attilax著 1. 几大最佳实践减肥行为 1 1.1. 控制饮食分量用小碗 小盘子 小餐具 1 1.2. 软件如何减肥,控制资源占有率,比如体积 打包
  9. 荷兰国旗问题以及快速排序
  10. JxBrowser 7 Crack 申请试用教程
  11. 路由交换技术-实验3: SSH远程登陆
  12. docker视频教程 百度云网盘
  13. Mac下输入法总是默认中文,怎么设置成英文的?
  14. mysql数据库存图片名_【mysql】数据库存图片,是存图片名称?还是存图片路径??...
  15. 为什么要在单片机程序中使用结构体和指针
  16. 2023 CVTE寒暑假实习C++开发 笔试一面面经
  17. 【全球品牌】圣经中人物的名字有哪些?
  18. IMU(Inertial measurement unit)
  19. 【独立站运营】营销邮件被判定为垃圾邮件?四个方法教你避开
  20. 《点燃我温暖你》---爱心代码

热门文章

  1. Timer 和 TimerTask 定时任务
  2. flutter项目:启动名称生成器(代码解析)
  3. java在线制作视频,调用ffmpeg(一)
  4. html em用法,中文Web设计HTML的em标记使用
  5. 巴伦变压器电路图_宽带巴伦变压器
  6. PA0-PA开发环境配置
  7. 简单几步骤查询所有快递物流信息
  8. Mac——技巧:用“提醒事项”将任务分配给其他人
  9. 小程序如何跳转公众号文章
  10. Keil MDK使用第16篇---call stack +locals 调用堆栈值