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系统可能会导致主副机切换

 

原文地址:https://www.cnblogs.com/yangyanga/p/11940153.html