这是阿里风控部门一面的题目
当时我想当然说栈溢出,面试官也没多说,接着又问我cpu和内存会怎么样
我当时说抛出oom之后cpu负载应该降下来,因为守护线程gc都随着主线程的结束而结束
回来稍微摸你了一下,写了一些感悟如下:
死循环创建哈希map,cpu负载400,内存4299M 4G
但是就是不报错,也没有说继续升高负载和内存--->这个内存刚好是这台mac的1/4内存
也就是说这是最大堆内存,而这台电脑是8核超线程的,16负载相当于,cpu负载也刚好1/4,真的这么巧合吗,我想一定有默认参数设置了的
这里内存一直在4G堆最大,说明GC一直处在回收的状态,堆内存刚好卡在临界点
个人猜想:本身一次循环结束是会进入safePoint开始垃圾回收,但是由于你在执行死循环,那么实际上创建的速度远大于GC回收的速度,一开始Parall回收器并没有开很多的垃圾回收线程来清理这些垃圾,但是随着堆空间逐渐被沾满,垃圾回收线程增加的越来越多,最终产生了一个平衡点,就是你的创建速度和我的回收速度达成一致,但内存还是满的,如果我的回收速度大于了你的创建速度,才有可能清理掉我堆中的4G哈希map
CPU 400的负载来自多路并行的垃圾回收线程
重新试了一下,cpu和内存几乎是在1秒内飙升到400和4G,也就是说启动需要一个过程,这之前死循环创建对象的能力大于垃圾回收的能力,所以才会有4G的堆满空间
实际开发经验还是太少,如果错了,以后再更正自己的想法吧。