zoukankan      html  css  js  c++  java
  • JVM、Gc工作机制详解

    JVM主要包括四个部分:

    1. 类加载器(ClassLoad)
    2. 执行引擎
    3. 内存区:
    4. 本地方法接口:类似于jni调本地native方法

    内存区包括四个部分:

            1.方法区:包含了静态变量、常量池、构造函数等

            2.Java堆:java实例或者是对象

            3.Java栈:java栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的java栈。在这个java栈中又会包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值等。每 一个方法从调用直至执行完成的过程,就对应一个栈帧在java栈中入栈到出栈的过程。所以java栈是现成私有的。

            4.程序计数器:保存线程执行的内存地址

            5.本地方法栈(Native Method Stack):和java栈的作用差不多,只不过是为JVM使用到的native方法服务的。

    内存分配

      内存分配主要有3种方法:静态分配、栈式分配、堆式分配

      静态分配:主要是静态存储区,存放静态变量、全局static数据和常量,在程序编译的时候就被分配,在整个程序运行的过程中都存在。

      栈式分配:一般存放方法中的局部变量(基础数据类型和局部对象),方法执行结束后变量所持有的内存都会被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

      堆式分配:又称动态分配,一般是new出来的对象,会被gc回收。

    垃圾检测、回收算法

    垃圾检测的方法:

      1.引用计数法:给一个对象添加引用计数器,每当有个地方引用它,计数器就加1;引用失效就减1,当计数器为0的时候就会被回收,但是这个方法有一个缺陷是如果两个对象互相引用,但是没有被其他的对象引用,那这两个对象肯定是垃圾对象,但是此刻的计数器不会为0,不会被回收。

      2.可达性分析法:

      这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。如图3-1所示,对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。

       在Java语言中,可作为GC Roots的对象包括下面几种:

        1.虚拟机栈(栈帧中的本地变量表)中引用的对象。

        2.方法区中类静态属性引用的对象。

        3.方法区中常量引用的对象。

        4.本地方法栈中JNI(即一般说的Native方法)引用的对象。

     垃圾回收的算法:

      1.标记清除:这种算法分为两个阶段,第一步是从根节点标记所有被引用的对象,第二步是从这个堆中清除其他未被引用的对象,这种算法有一个弊端是清除后的内存是不连续的,产生了很多的碎片。

      2.复制:将内存划分为两个相等大小的区域,每次只使用其中的一个区域,将正在使用的对象复制到另外一片内存中,还可以进行相应的整理,这种算法的缺点是需要两倍的内存。

      3.标记-整理:复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在新生代经常发生,但是在老年代更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活的对象较多,复制的成本也将很高。

       标记-压缩算法是一种老年代的回收算法,它在标记-清除算法的基础上做了一些优化。首先也需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,其性价比比较高。

      4.分代收集算法:将对象按其生命周期的不同划分成:年轻代(Young Generation)、年老代(Old Generation)、持久代(Permanent Generation)。其中持久代主要存放的是类信息,所以与java对象的回收关系不大,与回收息息相关的是年轻代和年老代。

  • 相关阅读:
    神经网络学习之----单层感知器
    神经网络学习之----神经网络发展史
    神经网络学习之----神经网络概述
    C语言几种常见的字符串输入
    基于单链表实现集合的交集、并集、差集的运算
    关于单链表的一些基本操作
    输入20个整数存放到一个单向链表中,并顺序逆序输出
    《你的灯亮着吗》阅读笔记
    场景调研
    站立会议总结09
  • 原文地址:https://www.cnblogs.com/hxchaoshuai/p/9047872.html
Copyright © 2011-2022 走看看