• JVM


    根据java虚拟机规范的规定,java虚拟机所管理的内存将包括以下几个运行时数据区域。

    • 程序计数器
    • Java虚拟机栈
    • 本地方法栈
    • 方法区

    程序计数器(线程私有)

      较小的内存空间,当前线程所执行的字节码的行号指令器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

      没有规定任何OutOfMemoryError情况的区域。

    Java虚拟机栈(线程私有)

      描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

      每个方法从调用直至执行完成的过程,对应着一个栈帧在虚拟机栈中出栈到入栈的过程。

      java内存分为堆内存,栈内存,此处的栈指的是虚拟机栈中局部变量表部分:编译期可知的8种基本数据类型(boolean, bit, char, short, int, float, long, double),对象引用。局部变量表所需内存空间在编译期确定。

      StackOverFlowError,OutOfMemoryError

    本地方法栈(线程私有)

      类似虚拟机栈,用来处理本地(native)方法。

    java堆(线程公有)

      存放对象实例,所有的对象实例额数组都是在堆上分配内存。

      是垃圾收集器管理的主要区域。java堆可以进一步划分,为了更好的回收、分配内存。

      java堆可以处于物理上不连续的内存空间,逻辑连续即可。-Xms:jvm启动时申请的最小对内存,-Xmx:jvm可以申请的最大堆内存。

    方法区(线程公有)

      存储已被JVM加载的类信息,常量,静态变量等。

      永久代(堆的一个逻辑部分,不是堆)

    •   运行时常量池

        存放编译期生成的各种字面量(常量)和符号引用。

        动态性:常量不一定只有编译期才产生,运行期也可将新的常量放入池中。String类的intern()

    直接内存

      jvm内存之外的一个内存。jdk1.4中新加入类NIO,引入一种基于管道与缓冲的I/O方式,使用Native函数库直接分配对外内存,通过存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。避免在java堆和Native堆中来回复制数据,提高程序效率。

    垃圾收集器与内存分配策略

    1. 为什么需要了解GC和内存分配?:排查各种内存溢出,内存泄漏问题,垃圾收集成为系统达到更高并发量的瓶颈时。
    2. 哪些内存需要回收?Java堆和方法区。程序计数器,虚拟机栈,本地方法栈是线程私有,随着线程结束,内存就被回收了。
    3. 判断对象“已死”?
      1. 引用记数算法:给对象添加一个引用计数器,有一个地方引用它,计数器加一,引用失效,计数器减一。问题:对象之间相互循环引用
      2. 可达性分析算法:从“GC Roots”作为起点,从这些节点开始向下进行搜索。搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(即从GC Roots到这个对象不可达),证明这个对象是不可用的(已死)
    4. 引用分类:
      1. 强引用
      2. 软引用:还有用非必须(缓存)
      3. 弱引用:非必须,垃圾收集器工作时,无论内存是否充足 标记为弱引用的对象都会被回收掉
      4. 虚引用:跟踪记录  
    5. finalize():进行垃圾回收时要进行两次标记。①对象有没有和与GC Roots相连接的引用链,②有没有必要执行finalize()方法。(没有覆盖/已被调用 没必要执行)自救:在该方法重新与引用链上任一对象建立关联。只会被系统调用一次
    6. 回收方法区:
      1. 废弃常量:常量池中字面量(常量)  没有对象引用常量池中的这个‘abc’常量
      2. 判断无用的类:(可回收,不一定不使用了就必回收)
        1. 该类所有实例已被回收
        2. 加载该类的ClassLoader已经被回收
        3. 对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

    垃圾收集算法:

    1. 标记-清除算法:标记所有需要回收的对象,标记完成后统一回收所有被标记的对象。效率低,内存碎片
    2. 复制算法:

    新生代将内存划分为较大的伊甸园区和两块较小的存活区。8:1:1 每次使用Eden和其中一块存活区。

    回收时,将伊甸园区和存活区中还存活的对象一次性复制到另一块存活区上,清理掉伊甸园区和刚用的存活区。

      3.标记-整理算法

        不直接对可回收对象进行清理,而是让所有存活对象都像一端移动,清除掉边界以外的内存。

    分代收集:新生代(复制算法)老年代(标记-清除/标记-整理)

  • 相关阅读:
    GitLab的基础使用-汉化配置
    GitLab的基础使用-数据备份与恢复
    Apache Hadoop集群扩容实战案例
    Hadoop 集群-完全分布式模式(Fully-Distributed Mode)
    HDFS参数调优总结
    网站压力测试 工具webbench
    2013年十大必知的大数据分析公司
    做电子商务网上开店应该读的书
    教你用大功率路由器覆盖3平方公里的WiFi广告
    中央推进城镇化建设 六行业分享25万亿蛋糕
  • 原文地址:https://www.cnblogs.com/yunyouhua/p/8735088.html
Copyright © 2020-2023  润新知