版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
题外话
今天参加了恒生面试,一如既往的酒店面试。不同的是,这次是群面,第一次群面,所以我也认真听完了其他六个人的自我介绍和技术问答。概括来看,他们都有一个特点:知识水平大多停留在大学课程,有过一两次比赛经历,英语通过了四级,有一些体现“领导力”的社会实践;同时也不善言辞,或者不够自信,语言内容有时甚至会出现纰漏。有时候我会对这种无主见将自己刻意塑造为某种形象感到惋惜。引以为戒。
面试问题
知道jvm gc过程吗?能具体谈谈jvm的参数设置有那些吗?什么是内存泄漏(结合内存溢出)来谈?假如发生内存泄漏,继续强制执行垃圾回收会发生什么,比如说显示的调用的System.gc()?
QS1. 通过可达性分析的无用的对象,会首先被标记,以确定对象是否需要执行finaliize()方法;
之后会进行一次筛选,如果对象覆盖了finalize()方法,同时finalize()没有被其他虚拟机调用,则该对象在此被标记;
通过了第二次标记的对象会加入一个F-Queue的队列,同时等待一个由虚拟机自启的,低优先级的Finalizer线程去执行gc;
[执行:这里的执行只能保证触发,并不保证会虚拟机会等待它执行完成]
[自我拯救:在第一次标记后,线程仍然有机会去和可达性分析可以到达的线程建立联系,来再次使自己免于被回收]
QS2. 典型设置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
Xmx3550m :设置jvm的最大内存为35550M;
Xms3550m :设置jvm的内存促使内存为35550M,此值一般与Xmx的值相同;
Xmn2g:设置jvm年轻代的内存大小。堆大小=年轻代+老年代+持久代;
Xss128k:设置每一个线程占用内存的大小。正常情况下为1M,可以创建3000~5000个
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4