• jvm内存模型及垃圾回收GC


    一. jvm的内存模型分5个区域:

    1. 程序计数器:是线程私有的,用来记录当前线程的程序行号

      因为多线程执行时,保证线程切换后可以恢复到正确的执行位置,线程私有,每个线程都有自己的程序计数器

        2.虚拟机栈:就是传说的,线程私有,当一个方法执行时,会创建一个栈帧用于存储局部变量、操作数和方法出口等。一个方法被调用的过程,就是栈帧入栈和出栈的过程

      当线程请求的栈帧深度大于栈允许的栈帧深度时,会报StackOverFlowError

        3.本地方法栈:线程私有的,和虚拟机栈发挥的作用类似,当调用native方法时,使用的是本地方法栈

        4.方法区:线程共享,用于存放类模板(结构)信息、静态变量和常量等

        5.:线程共享,用户存放对象的实例,是垃圾回收的主要区域

      二. 垃圾回收:

       1.垃圾回收主要是针对堆内存进行回收,采用可达性分析算法,找到需要回收的对象;采用分代收集算法收集对象。

       2.可达性分析算法:将一些对象作为GC ROOTS,其他对象与GC ROOTS之间如果不存在引用链,则需要回收。

      可以作为GC ROOTS的对象有一下四种:

    1).方法区中的静态变量引用的对象
    2).方法区中的常量引用的对象
    3).栈帧中局部变量中的引用对象
    4).本地方法栈中的native方法引用的对象

      3.分代收集算法分3种:

    1).复制算法——新生代使用
    2).标记清除算法——老年代使用
    3).标记整理算法——老年代使用

      堆的内存空间分为新生代和老年代,(新生代又进一步分为Eden区、S0(survivor)区和S1(survivor)区,内存比例 8:1:1)

      对象是从Eden区产生的,当Eden区分配满的时候触发young GC,98%的对象都会被回收,不能被回收的对象将被复制到S0区,对象年龄+1,(对象头中存有年龄标志位,占4位,最大值正好是15,所以当对象年龄到达15岁时会晋升到老年代);当老年代中空间不足时,会触发Full GC,stop the world,即除GC线程外,所有线程都会停止工作,供可达性分析算法查找可以回收的对象。

        

  • 相关阅读:
    从零开始写代码AdaBoost算法的python实现
    从零开始写代码 ID3决策树Python
    redis有启动,但是其他主机telnet 不通的问题
    关于js查找和筛选和循环的几种方式(find();findIndex();filter();some();every();forEach;map();for/in)
    linux 设置tomcat 重启清空 catalina.out 断舍离
    旋转数组 断舍离
    nginx 普通用户启动配置 && springbootswagger 报错 Unable to infer base url 断舍离
    CentOS yum 直接安装最新的nginx【转】 断舍离
    买卖股票的最佳时机 II 断舍离
    swagger 的 pathmapping 配置的理解 断舍离
  • 原文地址:https://www.cnblogs.com/yayin/p/14121566.html
Copyright © 2020-2023  润新知