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.可触及的:从根节点可以触及到这个对象