谈谈对jvm虚拟机的了解:
jvm包含,堆,栈,方法区,
堆内存: 是分配所有对象实例,垃圾回收主要区域
堆内存又分为:老年代,年轻代
大对象就是需要消耗较大的内存空间 对象超过设置值的大小会直接进入老年代(数组,字符串)
长期存活的对象会进入老年代,一个对象的创建首先会进入年轻代每次GC回收他没被回收就会age+1,age=15就会进入老年代
对象动态年龄判断机制
老年代空间分配担保机制
方法区(元数据区):虚拟机加载的类信息,常量,静态变量
直接内存:非jvm堆外内存对的堆外内存NIO会直接操作,读写效率高
引用计数法:A引用B就会给A的引用计数器加1,断开则减1,当对象引用计数器为0则判定这个对象为垃圾GC需要回收,但是A引用B,B又引用A则导致对象一直存活
可达性分析法:从GCroot根开始直接找到对象,或间接找到对象称为可达也是存活对象,反之不可达
那些方法可以成为GCroot:虚拟机栈引用对象,本地方法栈引用对象,静态属性引用对象,常量引用对象、
对象的引用分类:1.强引用,普遍存在的对象引用
2.软引用,内存溢出前回收
3.弱引用,下次垃圾回收
4.虚引用,形同虚设
1,标记清除算法:首先标记出所有需要回收的对象,标记完成后统一回收,这样的回收方式会产生大量不连续的内存碎片
2,标记整理算法:为了解决标记清除算法所产生大量不连续的内存碎片,在垃圾回收之后会集中整理内存区域,得到未使用的区域,虽然内存碎片被集中整理了但是这种效率比较低,那么新的解决方案又来了。
3,复制算法:复制算法就是把内存划分为大小相同的两块(一分为二)每次只留其中一块,当这一块内存用完了就将还存活的对象复制到另外一块上,然后再把这块内存一次性的清理掉,
好处:效率高,没碎片适合朝生夕死的内存区域,
缺点:内存利用率低,且不适合在对象存活率高的老年代使用!
4.分代回收算法:JVM中使用的是分代回收算法,对于新生代采用复制算法,并且为了最大化的利用空间将内存划分为8:1:1 对于老年代或者元数据区因为对象存活率比较高,采用标记清理/整理算法
垃圾收集器是内存回收的具体实现,
Serial收集器:单线程收集器垃圾收集时必须暂停其他线程的所有工作,直到收集结束为止 优点:简单高效
ParNew收集器:ParNew是Serial的多线程版本,新生代采用复制算法,老年代采用标记整理算法,它可以和并发收集器一起配合工作
CMS收集器优缺点:优点:并发收集,低停顿,缺点:对CPU资源敏感,无法处理浮动垃圾,它使用标记清理算法会产生大量的空间碎片,执行的不确定性,会存在上次垃圾还没回收完,垃圾回收又被触发的情况