zoukankan      html  css  js  c++  java
  • 关于JVM高级特性的总结

    1.在JVM中有一块很重要的内容-------内存管理

        内存管理中又有--------运行时数据区域

         方法区(method area)             ||                   虚拟机栈(VM  stack)                                      本地方法栈 (native method stack)     

                                                            ||                    

         堆(heap)                                ||                   程序计数器(program  counter register):程序一行一行的执行,就归功于这一部分(你可理解为程序   行数)

                     ||

    2.java虚拟机栈:每个方法在被调用时就会创建一个栈帧,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中到出栈的过程(-Xss)

    3.java堆:是java虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域,几乎所有的对象实例都在这里分配内存。(注意这里的修饰词是几乎,那么什么对象实例不在这里分配呢??? class类)是垃圾收集器(GC)管理的主要区域(-Xms;-Xmx;-Xmn)

    4.方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,运行时常量池(runtime constant pool)是方法区的一部分。(-XX:permSize)

    5.直接内存:并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。

    -------------------------说了那么多  ,看了那么多 ,上干货-------------------------

    来点内存溢出看看

          1. java堆溢出

          2.方法区和运行时常量池溢出

          3.虚拟机栈和本地方法栈溢出

          4.本机直接内存溢出

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

        1.GC要做的事?

             1.where/which ?       2. when?  3. how?

      在运行时数据区域中  谁需要GC?

      很显然根据栈的原理  对于类加载都是先进入后出  换言之类操作完成后自动清理,从内存中释放掉了。因此不需要GC

      而堆和方法区是需要的

     2.那在程序中如何判断对象是否存活?也就是判断哪学是需要GC区处理的

       1.引用计数算法

          就是对象每次被引用都+1 如果是0那就表示没有被引用可清理。

          但是这种方法存在缺陷,如果两个对象互相引用,会陷入死循环。      

       2.可达性分析    

            GC roots  

              | 

              obj1                         obj4

               |                             |

             ---------                     -------

            |         |                  |       |

          obj2        obj3              obj5      obj6

    根节点roots到达不了obj4  应该判定为obj4及其子节点为可回首对象

     3.标记--清除算法 

       缺点:碎片化

     4.复制算法

       缺点:内存最大使用率只有百分之五十,浪费空间

     5.标记--整理算法

       缺点:速度慢

    实际开发将这三种清除算法结合使用  

     6.新生代  --- 老年代

       新生代适合用--复制算法

       老年代---标记清除和标记整理算法

  • 相关阅读:
    Redis 读后小感
    Redis学习笔记十:独立功能之监视器
    Redis学习笔记九:独立功能之慢查询日志
    Redis学习笔记八:独立功能之二进制位数组
    Please restart this script from an administrative PowerShell
    MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”
    Macaca之Android原理浅析
    Macaca 基础原理浅析
    您需要来自XXX的权限才能对此文件夹进行更改
    JS是按值传递还是按引用传递?
  • 原文地址:https://www.cnblogs.com/woniufei/p/9396167.html
Copyright © 2011-2022 走看看