• java内存相关


    运行时数据区域:

    1、程序计数器:线程执行时的字节码行号指示器。

    2、java虚拟机栈(Stack,获者称为方法栈):java方法执行的内存模型。调用方法的时候,就会创建一个虚拟机栈,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

    3、本地方法栈:存放需要调用到的Native方法的相应数据。

    以上三者是线程私有的。

    下面的两个是线程共享的。

    4、java堆(Heap):用于存放实例对象,数组。

    5、方法区:用于存放被虚拟机加载的类信息,常量,静态变量,即时编译后的代码数据。

    永久代,方法区,元空间:

      方法区是虚拟机的规范,HotSpot用方法区来表示永久代。

      JDK8中:元空间属于本地内存;存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中。

     

    基于分代的思想进行划分:

    堆(Heap)的细分:新生代,老年代。

      其中,新生代又分为:Eden,From Servivor,To Servivor。

    方法区:永久代

      

    分代思想的具体应用:

      1、所有的对象,出生在Eden区。

      2、eden:from servivor:to servivor = 8 : 1 : 1

      3、堆内存不够,发生GC。将存活的对象拷贝到from servivor区域,对象在servivor中每熬过一次GC(from , to 这两个轮流用),就增加一岁。当增加到一定的岁数后,就将对象移到老年代。

      4、新生代发生的GC为Minor GC。发生在老年代GC为Full GC。做一次 Full GC 要比进行一次 Minor GC 的时间更长(10倍)。

    内存的分配以及GC:

      1、eden创建对象。

      2、当eden内存不足时,触发 Minor GC, 将eden中的存活对象,复制到from servivor。

      3、当eden内存又不足时,触发 Minor GC,将eden、from servivor中存活的对象,复制到to servivor中。

      4、当eden内存又不足时,触发 Minor GC ,将eden、to servivor中存活的对象,复制到from servivor中。

      5、在步骤3、4中,执行复制时,会判断对象是否达到进入老年代的条件,如果符合条件,则拷贝到老年代中。

      6、如果老年代空间不足,则发生Full GC 。

    逃逸分析与栈上分配:

      1、如果对象仅在方法体内使用,不进行传递,则该对象就分配到栈上。

    java内存模型:

    为何需要java内存模型(Java Memory Model,JMM):

      用于屏蔽各种操作系统和硬件之间的内存访问差异,使得java能够在各种平台下能够达到一致的运行结果。

    java内存模型(虚拟机内存):

      1、主内存:所有的变量都存储在主内存。(线程私有的变量,不存在主内存中)

      2、工作内存:线程的工作内存保存了该线程使用到的变量的主内存副本拷贝。

      两者的工作方式:

        线程对变量的所有操作(读取,赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程中的工作内存,相互独立,无法直接访问。线程见变量的传递都需要通过主内存来完成。

        线程 1<--(直接操作)--> 工作内存  <--(读写)--> 主内存

        线程 2<--(直接操作)--> 工作内存  <--(读写)--> 主内存

  • 相关阅读:
    ORACLE 定时执行存储过程
    Java 基于spring 暴露接口 供外部调用
    java 从jsp页面传集合给controller
    Java 后台验证的工具类
    Xcode12真机/模拟器运行项目非常慢的解决方式
    苹果手机系列 安全区高度/设置粗体高度不正常
    Xcode 官方下载地址
    OC UICollectionView 滚动完全显示item
    cocospod 更新到指定版本及其问题
    OC 一张图片填充满整个导航栏(包含X系列)
  • 原文地址:https://www.cnblogs.com/chen--biao/p/9795389.html
Copyright © 2020-2023  润新知