JVM整理

个人整理 如有出入 烦请留言指出 多谢

JVM整理

  • 方法区:存放static所修饰的,class类的加载信息(不要定义太多静态,因为回收机制不会回收),线程共享
  • 堆:存放对象和数组,线程共享
    JVM整理
    eden:当新创建一个对象,将会存放在此
    新生代会被优先回收,老年代优先级不高,新生代回收次数比较多,老年代次数比较少
    from(S0) 与to(S1)大小相同,这俩可解决内存空间的碎片问题,具体以复制算法
  • 栈:存放基本数据类型,对象的引用变量,每个线程都会有自己的本地线程栈,所以不会发生线程安全问题(类的方法存放在这)
  • 本地方法栈:JNI,用Java语言去调用C语言
  • 内存溢出:本质为内存不足
    堆内存溢出
    栈内存溢出
  • 内存泄露:内存充足,但是没有及时释放内存
  • 垃圾回收机制:主要针对堆进行垃圾回收
    1、引用计数算法
    每个对象添加一个计数器,循环操作计算器
    缺点:无法检测出循环引用,如父对象有一个对子对象的引用,子对象反过来引用父对象,这样他 们的引用计数永远不可能为0,而且每次加减非常浪费内存
    2、标记清除算法
    两个动作,一个标记,一个清除
    缺点:效率低,没有连续性,会产生大量碎片
    3、复制算法
    在新生代使用,from、to只会有一个在使用,大小相同,解决碎片
    4、标记-压缩算法
    老年代使用,对标记清除算法的优化
    5、分代算法
    使用范围为新生代,老年代
    GC经常在新生代回收,较少去老年代回收
  • 停顿现象
    要求系统进入一个停顿状态,以便更好地,高效地,一致地回收垃圾
  • 垃圾收集齐
    1、串行回收
    单线程回收(单核回收),效率低,[-xx:UseSerialGC]
    2、并行回收
    多线程(多核回收),效率高,[-xx:UseParNewGC]
    3、CMS
    减少了停顿时间