2/6牛客网头条

1.说说你知道的垃圾回收算法:
首先你要知道哪块需要用到GC,对于Java内存分为两块:线程私有内存区域和共享内存区。线程私有区不需要GC(随着线程死亡而死亡)。共享内存区才需要GC。
私有区域:程序计数器(运行到哪一行),java虚拟机栈(java方法),本地方法栈(本地方法native修饰的方法)
共享内存~~:java堆(实例对象分配在此,java内存最大一块,分为新生代and老年代),方法区(类~~ 的加载关于类的信息)
1.标记清除算法(两步,大量碎片)
2.复制算法(内存缩小为原来一半每次把活着的复制(排列好)到一边去,另一边全清空)用一半空一半
3标记整理算法(活着的排列好了,其它的全清空)
4.分代收集算法(最常用):
思想:根据存活的生命周期划分区域
新生代:堆中,又分为三部分Enden,from,to
年老代:堆中
永久代:方法区
注:
1.Minor GC发生频繁,Enden满了,就触发。
2.大对象直接分配在老年代(大数组…避免每次都复制)
3.长期存活对象分配在年老代。(每个对象都有一个age计数器,每经过一次minor gc,age+1,jvm有个参数默认为15,可改,超过age就进入老年代)
4.major gc必然伴随着minor gc。
5~~~~.Major GC触发:
年老代满了,永久代满了,人为System.gc()触发。~~~~

2.标记部分,如何判断这个对象死亡了:
1.引用计数法(缺点是对象间循环引用没法解决。java不用)
2.可达性分析算法:
引用关系看作一张图,从一个GC root为起点,寻找对应的引用节点,是否有引用链可以到这个对象相连,可达连着救活,不被连就死了
注:对象被回收前最后一次挣扎。
那些不可达的对象并不是立刻被回收,还有拯救的机会。有两次标记过程,第一次判断对象是否重写了finalize方法,没有重写则进行第二次回收,等死吧。重写了成功与GC root建立了联系,逃脱本次回收。
GC root来源:
java虚拟机栈引用的对象。本地方法栈引用的对象。方法区中引用的对象。
3.频繁发生major gc:
尽量避免创建大数组和对象,尽可能根据参数提高age让对象在新生代多存活一段时间。
4.何时会STW,所有垃圾回收器都会有STW吗:
STW(stop the world)收集时会暂停其他所有工作线程。
不是所有的垃圾收集器都会有STW。
Serial收集器,STW,复制算法——新生代
ParNew收集器,多线程的Serial(STW,复制算法,除了几个GC其余线程全关。)
Parallel Scavenage(PS)收集器,没有STW ,复制算法——新生代,吞吐量可控制
Serial Old,STW,标记整理——老年代
Parallel Old,无STW,PS收集器的老年版本
G1收集器:高吞吐量同时,尽可能最短停顿时间。
堆内存被划为多个大小相同的区域(region),每个region是一段逻辑连续的内存区域。在这里插入图片描述
CMS收集器,最短停顿为目标,标记清除算法
四个过程:初始标记,并发标记,重新标记,并发清除。初始标记和重新标记是STW
所以哪里有STW:
Serial收集器,Serial Old收集器,ParNew收集器,CMS收集器的初始标记和重新标记过程。

5.内存泄漏和内存溢出的区别:
内存泄漏:存在无用但可达的对象(还在被引用),GC无法回收。
内存溢出(out of memory):内存不够用了。
大量的内存泄露必然会导致OOM

6.ArrayList如何扩容的:
每次用add()添加元素,都要对list容量进行判断,容量够直接添加,容量不够自动调用grow()方法,grow()方法中调用Arrays.copy(old,new)方法进行数组复制。默认初始10,每次扩容1.5倍

7.String str = new String(“abc”)的操作有几个对象产生:
两个,str创建在栈上,abc首先在常量池上看看有没有,有就拷贝到堆内存一份,没有就先在常量池中创建然后拷贝。
改:String str1=“abc”,String str = new String(“abc”)后半单个话的操作有几个对象?一个。因为str1创建在常量池了,然后str,abc从常量池拷贝一份到堆上。
注:
1.所有Object对象都有equals(),hashCode()方法,在String中自动改写了equals()方法,判断内容一不一样。
2.String c= new String(“abc”),String d = new String(“abc”)c.equals(d),true,虽然c,d指向堆上不同位置,但是内容一样。
8.CMS在哪个阶段会停顿,哪个阶段停顿的时间最长?
初始标记:短暂的停顿时间
并发标记:有浮动垃圾,最长的停顿时间
重新标记:清理上一步浮动垃圾,停顿时间比并发标记少
并发清除:清除标记的垃圾,有浮动垃圾,等待下一次GC。
注:
1.并发一边收垃圾一边有工作线程,产生垃圾就是浮动垃圾
2.STW但是速度快,并不怎么占用时间
3.缺点:对cpu敏感,有浮动垃圾,空间碎片,空间换时间
9.为什么要有GC,何时触发GC?
对象的回收操作
触发条件:
对象没有引用(有逃逸)
程序执行了System.exit()
程序发生意外终止
程序在作用域正常执行完毕
10.gc原理:
采用四种
优缺点:
标记清除:内存空间碎片,但是胜在简单
复制算法:GC后内存空间连续,内存空间缩小为原来一半,造成空间浪费
标记整理:避免了上述缺点,但是效率比较低,慢
11.收集器:
新生代:Serial,ParNew,PS
老年代:Serial Old,Parallel Old,CMS(标记整理),G1
12.空间分配担保:
新生代中大量幸存,Survivor经过minor gc后仍然空间不够,老年代会进行空间分配担保(检查一下老年代区域是否大于新生代存活区域,小于进行一下major gc),存活对象晋升到老年代。
13.垃圾回收器优缺点:
Serial/Serial Old:简单,用户停顿感体验差STW
ParNew:STW高停顿,多CPU下比Serial快高吞吐,单CPU下和Serial
PS:精准控制吞吐量,停顿时间少,但是收集次数多
Parallel Old:多线程。
CMS:多线程,低停顿为目标。浮动垃圾,空间碎片,对cpu资源敏感。
G1:相比CMS精准控制吞吐。无空间碎片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值