一个 System.gc 就能让你在面试中被打击到怀疑人生
第一时间获取技术干货和业界资讯!
一个 System.gc 就能让你在面试中被打击到怀疑人生
人的一生中可能会遭遇到无数次打击。而今天我就给大家介绍一个你可能忽略的知识点:System.gc,给你专门来一次降维打击。降低到某个细微的知识点,让你被打击的体无完肤。
面试题一:在 Java 中,如何手动的让 GC 进行垃圾回收?
这个方法其实有很多种。常见骚操作有 System.gc(),通过 jmap 来触发,或者通过 jvmti 做强制 GC 等。
面试题二:System.gc 是 Full Gc 吗?
System.gc 其实是做一次 full gc。这一点可以根据 DisableExplicitGC 的注释说明来看。Tells whether calling System.gc() does a full GC。
面试题三:System.gc 的危害是什么?
因为 System.gc 是一个 Full gc,所以会暂停整个进程。如果进程经常被频繁暂停,就要注意超时、并发等问题。
面试题四:如何避免 System.gc ?
通过 -XX:+DisableExplicitGC 禁掉 System.gc。
面试题五:System.gc 的 Full Gc 如何做到暂停整个进程?
Java 里面的 GC 有一个重要的线程 VMThread。在 jvm 里,这个线程会不断轮询它的队列,这个队列里主要是存一些 VM_operation 的动作,比如最常见的就是内存分配失败要求做 GC 操作的请求等,在对 gc 这些操作执行的时候会先将其他业务线程都进入到安全点,也就是这些线程从此不再执行任何字节码指令,只有当出了安全点的时候才让他们继续执行原来的指令,因此这其实就是我们说的 stop the world(STW),整个进程相当于静止了。
面试题六:并行的 Full GC 是否有了解?
并行 Full GC 也同样会做 YGC 和 CMS GC,但是效率高就搞在 CMS GC 是走的 background 的,整个暂停的过程主要是 YGC、CMS_initMark、CMS_remark 几个阶段。background 顾名思义是在后台做的,也就是可以不影响正常的业务线程跑,触发条件比如说 old 的内存占比超过多少的时候就可能触发一次 background 式的 cms gc,这个过程会经历 CMS GC 的所有阶段,该暂停的暂停,该并行的并行,效率相对来说还比较高,毕竟有和业务线程并行的 gc 阶段;而 foreground 则不然,它发生的场景比如业务线程请求分配内存,但是内存不够了,于是可能触发一次 cms gc,这个过程就必须是要等内存分配到了线程才能继续往下面走的,因此整个过程必须是STW的,因此 CMS GC 整个过程都是暂停应用的,但是为了提高效率,它并不是每个阶段都会走的,只走其中一些阶段,这些省下来的阶段主要是并行阶段。
以上几个关于 System.gc 的问题,你是否被雷到了。其实 Java 的 Gc 还是很复杂的,我只是降低维度到了 System.gc 这个具体的方法,后面有时间了,我们在继续分享。
- 记录个面试经历,关于java内存区域,感觉被玩了一遍,怀疑人生
- J. Superfactorial numeral system(一个想到了就能做出来的逻辑题,很数学)(关于阶乘的构造)
- 一个利用System.gc和finalize研究Java垃圾回收机制的练习
- 【程序员人生】一个程序大牛的面试经历
- Redis面试灵魂36问,你怀疑人生吗?(含答案)
- 一个面试官对面试问题的分析—GC
- Java基础之一个 ArrayList 就能让你面试到哭!
- 垃圾回收机制(四)- System.gc()
- 最近去一个公司面试
- 面试了一个2年程序员,竟然只会curd,网友神回复!
- 一个总经理的11个经典面试问题
- 一个三本学生的面试之旅
- [面试] C++ STL(一)—— 向一个vector中添加N个元素,平均的添加的性能是?
- 在面试中体悟到人生
- 第一次用javascript写了一个不用刷新就能实现--用户名验证的例子
- java能不能自己写一个类叫java.lang.System/String正确答案
- 实战Java虚拟机之四:提升性能,禁用System.gc() ?
- 一个很费解的面试题目 有点儿意思
- STM32不用固件库容易产生的一个问题:Undefined symbol SystemInit
- OSChina 周五乱弹 —— 你开始怀疑人生了吗?