• jvm总结


    jvm总结

    1.JVM基本结构:

      1.pc寄存器:每个线程有一个PC寄存器,在线程创建时创建,指向下一条指令的地址,指定本地方法时,PC的值为undefind

      2.方法区:保存装载类的信息,类型的常量池,字段,方法字节码,通常和永久区关联在一起。(1.7后string等常量转移到堆中)

      3.java堆:和程序开发密切相关,应用系统对象都保存在堆中,所有线程共享java堆,堆分为新生代,老年代。GC的主要工作区。

      4.java栈:线程私有,由一系列帧组成,帧保存一个方法的局部变量,操作数栈,常量池指针,先进后出,每一次方法的调用创建一个帧,并压栈

    2.内存模型:

      1.每一个线程都有一个工作线程和主存独立,工作内存中存在主存中变量值得拷贝。

      2.数据从主存复制到工作内存中必须经过两个动作:一,由主存执行read操作;二,由工作内存执行load操作

      3.数据从工作内存中拷贝到主存中也要两个操作:一,由工作内存执行store操作;二,由主内存执行write操作

      4.每个操作都是原子的,执行期间都不会被中断

      5.对于一个普通的变量,一个线程中更新的值不能立马反应在另外变量中

      6.如果需要在其他线程中立刻可见,需要使用volatile

      7.保证可见性的方法:

        1.volatile

        2.synchronized(unlock之前,写变量值回主存)

        3.final(一旦初始化,其他线程都可见)

    3.JVM常用参数配置:

      1.Trace参数配置:

        1.-verbose:gc

         -XX:+printGC  #可以打印GC的信息

        2.-XX:+printGCDetail #详细信息

      2.Trace跟踪参数:

      --按下Ctrl+Break,打印类的信息,显示序号,实例数量,总大小

      3.堆的分配参数:

        1.新生代:老年代=1:4

        2.新生代包括Eden和survivor1和survivor2比值为8:1:1

        3.在OOM时,记得dump出堆,排查问题

      4.永久区参数设置:PermSize,MaxPermSize:表示一个系统可以容纳多少个类型,永久堆溢出也会导致OOM

    4.GC算法与种类:

      1.GC的对象是堆空间和老年代

      2.引用计数法:对于对象A,任何地方引用A,A的引用计数器加1,引用失效时,计数器减1,只要A的引用计数器为0,则对象A不能在被使用。

      3.引用计数法的问题:引用的加法和减法,影响性能;很难循环处理引用

      4.标记清除算法:将垃圾回收分为两个阶段:标记阶段和清除阶段。

        1.在标记阶段,首先通过根节点,标记从根节点开始所有可达对象。因此,未被标记对象就是未被引用的垃圾对象。

        2.清除阶段,清除所有未被标记对象。

      5.标记压缩算法:适用于存活对象较多的场合,如老年代。标记阶段类似,清除阶段将所有对象压缩到内存一端,然后清除边界外所有空间。

      6.复制算法:与标记清除算法相比,相对高效

        1.不适合于对象较多的场合如老年代。

        2.将原有内存空间分为两块,每次使用一块,垃圾回收时,将正在使用内存中存活的对象复制到未使用的内存当中,之后清除正在使用中的内存中的所有对象,交换两个内存的角色,完成垃圾回收。

        3.复制算法的问题:浪费空间,整合标记清理算法思想

    5.分代思想:

      1.短命对象称为新生代,长命对象称为老年代

      2.少量对象存活,适合复制算法;大量对象存活,适合标记算法或者标记压缩

    6.可触及性:

      1.可触及的:从根节点可以触及到这个对象

      2.可复活的:一旦引用被释放就是可复活状态,因为可以在finalize()中可以复活

      3.不可触及的:在finalize()后,可能会进入不可触及阶段,不可触及阶段的对象不能复活,可以回收

      4.不推荐使用finalize(),建议使用try catch finally 

    7.stop-the-world:

      1.java中全局暂停的现象

      2.全局暂停,所有java代码停止工作,native代码可以工作但不能与JVM互动

      3.多半由GC造成

      4.危害:严重影响性能,遇到HA系统可能会导致主副机切换

     

  • 相关阅读:
    redis 笔记
    经验
    增加模块-概念图
    node API buffer
    VS2010中使用CL快速 生成DLL的方法
    WIN7下VS2010中使用cl编译的步骤
    Win7下VS2010编译的程序在XP报错:找不到msvcp100d.dll或者msvcp100.dll
    C#速学
    Windows下架设SVN服务
    Redis 压力测试
  • 原文地址:https://www.cnblogs.com/yangyanga/p/11940153.html
Copyright © 2020-2023  润新知