关于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.新生代  --- 老年代

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

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

猜你喜欢

转载自www.cnblogs.com/woniufei/p/9396167.html