diff --git "a/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/JVM \347\257\207/JVM\351\235\242\350\257\225\351\242\230.md" "b/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/JVM \347\257\207/JVM\351\235\242\350\257\225\351\242\230.md" index 5bda042..2eef813 100644 --- "a/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/JVM \347\257\207/JVM\351\235\242\350\257\225\351\242\230.md" +++ "b/Java\351\235\242\350\257\225\351\242\230\351\233\206\347\273\223\345\217\267/JVM \347\257\207/JVM\351\235\242\350\257\225\351\242\230.md" @@ -1,52 +1,717 @@ -### JVM 篇 -1. 什么情况下会发生栈内存溢出。什么时候发生堆溢出?你是怎么排错的? -2. JVM怎么判断对象是可回收对象?有哪些方法。 -3. JVM的内存结构,新生代与老年代的比例,Eden和Survivor比例。 -4. 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。 -5. 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。 -6. JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。 -7. JVM 出现 fullGC 很频繁,怎么去线上排查问题? -8. JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。 -9. 垃圾回收算法的实现原理。 -10. JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。 -11. 说一下Java对象的创建过程 -12. 你们线上应用的JVM参数配置了哪些。 -13. G1和cms区别。 -14. 怎么打出线程栈信息。 -15. 说一下类加载的执行过程 -16. JVM垃圾回收机制,何时触发MinorGC等操作呢? -17. ZGC 垃圾收集器,了解过吗 -18. 对象的访问定位有哪两种方式? -19. 说一下 jvm 调优的工具? -20. 对象什么时候会进入老年代? -21. 内存泄漏和内存溢出区别? -22. 什么是tomcat类加载机制? -23. 了解逃逸分析技术吗 -24. 调用System.gc()会发生什么? -25. 谈谈Minor GC条件,full GC条件 -26. Stop The World 了解过吗? -27. 谈谈你认识多少种OOM?如何避免OOM? -28. 了解过JVM调优没,基本思路是什么?如何确定它们的大小呢? -29. 淘宝热门商品信息在JVM哪个内存区域 -30. 字节码的编译过程 -31. Java需要开发人员回收内存垃圾吗? -32. Java中垃圾回收有什么目的?什么时候进行垃圾回收? -33. System.gc()和Runtime.gc()会做什么事情? -34. 主内存与工作内存 -35. 内存间交互操作 -36. volatile 禁止内存重排序 -37. 内存模型三大特性 -38. 谈谈先行发生原则 -39. JVM 堆内存溢出后,其他线程是否可继续工作? -40. 说一下JVM 常用参数有哪些? -41. VM 为什么使用元空间替换了永久代? -42. Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)? -43. JVM的永久代中会发生垃圾回收么? -44. 什么是字节码?采用字节码的最大好处是什么?什么Java是虚拟机? -45. MinorGC 的过程 -46. CPU 占用过高如何分析 -47. Serial与Parallel GC之间的不同之处? -48. WeakHashMap 是怎么工作的? -49. 解释 Java 堆空间及 GC? -50. 你能保证 GC 执行吗? -51. JVM中哪个参数是用来控制线程的栈堆栈小的? +### JVM 绡 +1. 浠涔堟儏鍐典笅浼氬彂鐢熸爤鍐呭瓨婧㈠嚭銆備粈涔堟椂鍊欏彂鐢熷爢婧㈠嚭锛熶綘鏄庝箞鎺掗敊鐨勶紵 + 绛旓細鏍堝唴瀛樻孩鍑洪氬父鍙戠敓鍦ㄤ互涓嬫儏鍐碉細 + * 閫掑綊璋冪敤杩囨繁锛屾病鏈夋纭粓姝㈡潯浠讹紝瀵艰嚧鏍堝抚涓嶆柇鍘嬪叆鏍堣屾爤绌洪棿鑰楀敖銆 + * 灞閮ㄥ彉閲忚繃澶氭垨杩囧ぇ锛屽崟涓柟娉曡皟鐢ㄦ椂鏍堝抚瓒呰繃鏍堝閲忛檺鍒躲 + * 绾跨▼鍒涘缓杩囧锛屾瘡涓嚎绋嬮兘鏈夌嫭绔嬬殑鏍堢┖闂达紝鎬绘爤绌洪棿鑰楀敖銆 + 鍫嗘孩鍑洪氬父鍙戠敓鍦細 + * 绋嬪簭鐢宠鐨勫唴瀛樻婚噺瓒呰繃浜咼VM鍫嗙殑鏈澶у閲忥紙-Xmx璁剧疆锛夈 + * 鍙戠敓浜嗗唴瀛樻硠婕忥紙Memory Leak锛夛紝瀵硅薄涓嶅啀琚娇鐢ㄤ絾浠嶇劧琚紩鐢紝瀵艰嚧鍙敤鍫嗙┖闂撮愭笎鑰楀敖銆 + 鎺掗敊鏂规硶锛 + * **鏍堟孩鍑**锛 + * 浣跨敤JVM鍙傛暟 `-XX:+PrintStackTrace` 鎵撳嵃鍑哄畬鏁寸殑寮傚父鍫嗘爤淇℃伅锛屽畾浣嶅埌鍏蜂綋鐨勪唬鐮佽銆 + * 妫鏌ラ掑綊閫昏緫锛岀‘淇濇湁缁堟鏉′欢銆 + * 妫鏌ユ柟娉曞唴灞閮ㄥ彉閲忔暟閲忓拰澶у皬銆 + * 璋冩暣JVM鏍堝ぇ灏忓弬鏁 `-Xss`锛堜絾閫氬父涓嶆槸棣栭夛紝搴斿厛浼樺寲浠g爜锛夈 + * **鍫嗘孩鍑**锛 + * 鎹曡幏 `OutOfMemoryError` 寮傚父锛屽湪寮傚父澶勭悊涓 dump 鍫嗚浆鍌ㄦ枃浠讹紙Heap Dump锛夛紝甯哥敤鍙傛暟 `-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof`銆 + * 浣跨敤鍒嗘瀽宸ュ叿锛堝VisualVM, Eclipse MAT, JProfiler, YourKit锛夊姞杞紿eap Dump鏂囦欢锛屽垎鏋愬唴瀛樺崰鐢ㄦ儏鍐碉紝鏌ユ壘鍐呭瓨娉勬紡鐐癸紙濡傚摢浜涘璞″崰鐢ㄥぇ閲忓唴瀛橈紝鍝簺GC Roots寮曠敤浜嗗畠浠級銆 + * 鍒嗘瀽GC鏃ュ織锛坄-Xlog:gc*=info`锛夛紝瑙傚療鍐呭瓨澧為暱瓒嬪娍鍜孎ull GC鎯呭喌锛屽垽鏂槸鍐呭瓨娉勬紡杩樻槸鍫嗗ぇ灏忚缃笉褰撱 +2. JVM鎬庝箞鍒ゆ柇瀵硅薄鏄彲鍥炴敹瀵硅薄锛熸湁鍝簺鏂规硶銆 + 绛旓細JVM涓昏閫氳繃浠ヤ笅涓ょ鏂规硶鍒ゆ柇瀵硅薄鏄惁鍙洖鏀讹細 + * **寮曠敤璁℃暟娉曪紙Reference Counting锛**锛氫负姣忎釜瀵硅薄鍒嗛厤涓涓紩鐢ㄨ鏁板櫒銆傚綋鏈変竴涓湴鏂瑰紩鐢ㄥ畠鏃讹紝璁℃暟鍣ㄥ姞1锛涘紩鐢ㄥけ鏁堟椂锛岃鏁板櫒鍑1銆備换浣曟椂鍒昏鏁板櫒涓0鐨勫璞″氨鏄笉鍙兘鍐嶈浣跨敤鐨勶紝鍙互琚洖鏀躲傜己鐐规槸闅句互瑙e喅瀵硅薄闂寸殑寰幆寮曠敤闂銆 + * **鍙揪鎬у垎鏋愮畻娉曪紙Reachability Analysis / Tracing Algorithm锛**锛氳繖鏄洰鍓嶄富娴佺殑鍒ゆ柇鏂规硶銆傞氳繃涓绯诲垪绉颁负鈥淕C Roots鈥濈殑瀵硅薄浣滀负璧风偣锛屽悜涓嬫悳绱紝濡傛灉涓涓璞″埌GC Roots娌℃湁浠讳綍寮曠敤閾剧浉杩烇紙鍗充粠GC Roots鍒拌瀵硅薄涓嶅彲杈撅級锛屽垯璇佹槑璇ュ璞℃槸涓嶅彲鐢ㄧ殑锛屽彲浠ヨ鍥炴敹銆傚彲浠ヤ綔涓篏C Roots鐨勫璞″寘鎷細铏氭嫙鏈烘爤锛堟爤甯т腑鐨勬湰鍦板彉閲忚〃锛変腑寮曠敤鐨勫璞°佹柟娉曞尯涓被闈欐佸睘鎬у紩鐢ㄧ殑瀵硅薄銆佹柟娉曞尯涓父閲忓紩鐢ㄧ殑瀵硅薄銆佹湰鍦版柟娉曟爤涓璊NI锛圢ative鏂规硶锛夊紩鐢ㄧ殑瀵硅薄绛夈 +3. JVM鐨勫唴瀛樼粨鏋勶紝鏂扮敓浠d笌鑰佸勾浠g殑姣斾緥锛孍den鍜孲urvivor姣斾緥銆 + 绛旓細JVM鍐呭瓨缁撴瀯锛堜互HotSpot涓轰緥锛変富瑕佸垎涓猴細 + * **鍫嗭紙Heap锛**锛氬嚑涔庢墍鏈夌殑瀵硅薄瀹炰緥閮藉湪杩欓噷鍒嗛厤鍐呭瓨锛屾槸GC鐨勪富瑕佸尯鍩燂紝鍙粏鍒嗕负鏂扮敓浠e拰鑰佸勾浠c + * **鏍堬紙Stack锛**锛氭瘡涓嚎绋嬪垱寤烘椂閮戒細鍒嗛厤涓涓鏈夌殑鏍堬紝鐢ㄤ簬瀛樺偍灞閮ㄥ彉閲忋佹搷浣滄暟鏍堛佸姩鎬侀摼鎺ャ佹柟娉曞嚭鍙g瓑淇℃伅銆傛爤鍐呭瓨鏄嚎绋嬬鏈夌殑銆 + * **绋嬪簭璁℃暟鍣紙Program Counter Register锛**锛氭寚绀哄綋鍓嶇嚎绋嬫墽琛岀殑瀛楄妭鐮佹寚浠ゅ湴鍧锛屼篃鏄嚎绋嬬鏈夌殑銆 + * **鏈湴鏂规硶鏍堬紙Native Method Stack锛**锛氫负JVM浣跨敤鍒扮殑Native鏂规硶鏈嶅姟锛屼篃鏄嚎绋嬬鏈夌殑銆 + * **鏂规硶鍖猴紙Method Area锛/鍏冪┖闂达紙Metaspace锛**锛氬瓨鍌ㄥ凡琚櫄鎷熸満鍔犺浇鐨勭被淇℃伅銆佸父閲忋侀潤鎬佸彉閲忋佸嵆鏃剁紪璇戝櫒缂栬瘧鍚庣殑浠g爜绛夋暟鎹傚湪JDK 7鍙婁箣鍓嶆槸姘镐箙浠o紙PermGen锛夛紝JDK 8鍙婁箣鍚庢敼涓哄厓绌洪棿锛圡etaspace锛夛紝鍏冪┖闂翠娇鐢ㄦ湰鍦板唴瀛樸 + 鏂扮敓浠d笌鑰佸勾浠g殑姣斾緥锛氶粯璁ゆ槸 **1:2**锛屽嵆鏂扮敓浠e崰鍫嗗唴瀛樼殑1/3锛岃佸勾浠e崰2/3銆傚彲浠ラ氳繃 `-XX:NewRatio` 鍙傛暟璋冩暣锛堜緥濡 `-XX:NewRatio=2` 琛ㄧず鑰佸勾浠:鏂扮敓浠=2:1锛夈 + Eden鍜孲urvivor姣斾緥锛氭柊鐢熶唬鍐呴儴鍙堝垎涓轰竴涓狤den绌洪棿鍜屼袱涓猄urvivor绌洪棿锛團rom鍜孴o锛夈傞粯璁ゆ瘮渚嬫槸 **Eden : Survivor = 8 : 1 : 1**銆傚彲浠ラ氳繃 `-XX:SurvivorRatio` 鍙傛暟璋冩暣锛堜緥濡 `-XX:SurvivorRatio=8` 琛ㄧずEden:Survivor=8:1锛夈 +4. 浣犵煡閬撳摢鍑犵鍨冨溇鏀堕泦鍣紝鍚勮嚜鐨勪紭缂虹偣锛岄噸鐐硅涓媍ms鍜孏1锛屽寘鎷師鐞嗭紝娴佺▼锛屼紭缂虹偣銆 + 绛旓細甯歌鐨勫瀮鍦炬敹闆嗗櫒鏈夛細 + * **Serial GC**锛氬崟绾跨▼鏀堕泦鍣紝杩涜鍨冨溇鍥炴敹鏃跺繀椤绘殏鍋滄墍鏈夌敤鎴风嚎绋嬶紙Stop The World, STW锛夈備紭鐐规槸绠鍗曢珮鏁堬紙鍦ㄥ崟鏍窩PU涓婏級锛屽唴瀛樺紑閿灏忋傜己鐐规槸STW鏃堕棿闀匡紝涓嶉傚悎鏈嶅姟鍣ㄧ幆澧冦 + * **ParNew GC**锛歋erial GC鐨勫绾跨▼鐗堟湰锛屼娇鐢ㄥ涓狦C绾跨▼骞惰鍥炴敹銆傛槸璁稿Server妯″紡涓嬬殑棣栭夋柊鐢熶唬鏀堕泦鍣紝鍙互涓嶤MS閰嶅悎浣跨敤銆備紭鐐规槸骞惰鍥炴敹锛屽噺灏慡TW鏃堕棿銆傜己鐐规槸浠嶇劧鏄嫭鍗犲紡鍥炴敹锛屼笖闇瑕佸鏍窩PU鏀寔銆 + * **Parallel Scavenge GC**锛氭柊鐢熶唬鏀堕泦鍣紝浣跨敤澶嶅埗绠楁硶锛岃拷姹傞珮鍚炲悙閲忥紙Throughput = 鐢ㄦ埛浠g爜杩愯鏃堕棿 / (鐢ㄦ埛浠g爜杩愯鏃堕棿 + GC鏃堕棿)锛夈傚彲浠ラ氳繃 `-XX:MaxGCPauseMillis` 璁剧疆鏈澶ф殏鍋滄椂闂寸洰鏍囷紝浣嗘晥鏋滄湁闄愩備紭鐐规槸鍚炲悙閲忛珮銆傜己鐐规槸STW鏃堕棿鍙兘杈冮暱锛屾棤娉曠簿纭帶鍒舵殏鍋滄椂闂淬 + * **Serial Old GC**锛歋erial GC鐨勮佸勾浠g増鏈紝浣跨敤鏍囪-鏁寸悊绠楁硶銆傜敤浜嶤lient妯″紡鎴朠arallel Scavenge鐨勫悗澶囨柟妗堛 + * **Parallel Old GC**锛歅arallel Scavenge鐨勮佸勾浠g増鏈紝浣跨敤鏍囪-鏁寸悊绠楁硶銆備紭鐐规槸楂樺悶鍚愰噺锛屼笖鑰佸勾浠e洖鏀朵篃鑳藉苟琛屻傜己鐐规槸STW鏃堕棿鍙兘杈冮暱銆 + * **CMS锛圕oncurrent Mark Sweep锛塆C**锛 + * **鍘熺悊**锛氫竴绉嶄互鑾峰彇鏈鐭洖鏀跺仠椤挎椂闂翠负鐩爣鐨勬敹闆嗗櫒锛屽熀浜庘滄爣璁-娓呴櫎鈥濈畻娉曞疄鐜般備富瑕佷紭鐐规槸骞跺彂鏍囪鍜屽苟鍙戞竻闄わ紝澶ч儴鍒嗗伐浣滀笉闃诲鐢ㄦ埛绾跨▼銆 + * **娴佺▼**锛 + 1. **鍒濆鏍囪锛圛nitial Mark锛**锛歋TW锛屾爣璁癎C Roots鑳界洿鎺ュ叧鑱斿埌鐨勫璞°傞熷害寰堝揩銆 + 2. **骞跺彂鏍囪锛圕oncurrent Mark锛**锛氬湪鐢ㄦ埛绾跨▼缁х画杩愯鐨勫悓鏃讹紝浠嶨C Roots寮濮嬮亶鍘嗘暣涓璞″浘锛屾爣璁版墍鏈夊彲杈惧璞°傝楁椂杈冮暱浣嗕笉闇瑕丼TW銆 + 3. **閲嶆柊鏍囪锛圧emark锛**锛歋TW锛屼慨姝e苟鍙戞爣璁版湡闂村洜鐢ㄦ埛绾跨▼缁х画杩愯鑰屽鑷存爣璁颁骇鐢熷彉鍔ㄧ殑閭i儴鍒嗗璞$殑鏍囪璁板綍銆傝繖涓樁娈靛仠椤挎椂闂存瘮鍒濆鏍囪闀匡紝浣嗚繙姣斿苟鍙戞爣璁扮煭銆 + 4. **骞跺彂娓呴櫎锛圕oncurrent Sweep锛**锛氬湪鐢ㄦ埛绾跨▼缁х画杩愯鐨勫悓鏃讹紝娓呴櫎鎺夋湭琚爣璁帮紙涓嶅彲杈撅級鐨勫璞°傜敱浜庢槸鈥滄爣璁-娓呴櫎鈥濈畻娉曪紝浼氫骇鐢熷唴瀛樼鐗囥 + * **浼樼己鐐**锛 + * 浼樼偣锛氬苟鍙戞敹闆嗭紝浣庡仠椤裤 + * 缂虹偣锛氬CPU璧勬簮鏁忔劅锛堝苟鍙戦樁娈佃櫧鐒朵笉鏆傚仠鐢ㄦ埛绾跨▼锛屼絾浼氬崰鐢–PU璧勬簮褰卞搷搴旂敤鎬ц兘锛夛紱鏃犳硶澶勭悊鈥滄诞鍔ㄥ瀮鍦锯濓紙骞跺彂鏍囪鍜屾竻闄ゆ湡闂寸敤鎴风嚎绋嬩骇鐢熺殑鍨冨溇锛屽彧鑳界瓑鍒颁笅涓娆C锛夛紱鍐呭瓨纰庣墖闂锛堝彲鑳藉鑷村ぇ瀵硅薄鍒嗛厤鏃堕渶瑕佽Е鍙慒ull GC锛夈 + * **G1锛圙arbage-First锛塆C**锛 + * **鍘熺悊**锛氫竴娆鹃潰鍚戞湇鍔″櫒鐨勫瀮鍦炬敹闆嗗櫒锛屼富瑕侀拡瀵瑰澶勭悊鍣ㄣ佸ぇ鍐呭瓨鐨勬満鍣紝鍦ㄦ湁闄愬仠椤挎椂闂村唴鑾峰緱楂樺悶鍚愰噺銆傚畠灏嗘暣涓爢鍒掑垎涓哄涓ぇ灏忕浉绛夌殑鐙珛鍖哄煙锛圧egion锛夛紝姣忎釜Region閮藉彲浠ユ壆婕擡den銆丼urvivor鎴朞ld鐨勮鑹层傚畠璺熻釜鍚勪釜Region鐨勫瀮鍦句环鍊硷紙鍥炴敹鎵鑾峰緱鐨勭┖闂村ぇ灏忎互鍙婂洖鏀舵墍闇鏃堕棿鐨勭粡楠屽硷級锛屽湪鍚庡彴缁存姢涓涓紭鍏堝垪琛紝姣忔鏍规嵁鍏佽鐨勫仠椤挎椂闂达紝浼樺厛鍥炴敹浠峰兼渶澶х殑Region銆 + * **娴佺▼**锛 + 1. **鍒濆鏍囪锛圛nitial Mark锛**锛歋TW锛屼笌CMS鐨勫垵濮嬫爣璁扮被浼硷紝鏍囪GC Roots鐩存帴鍏宠仈鐨勫璞★紝浣嗗彲浠ュ埄鐢≧emark鏃舵敹闆嗙殑寮曠敤淇℃伅銆 + 2. **骞跺彂鏍囪锛圕oncurrent Mark锛**锛氫笌CMS绫讳技锛岄亶鍘嗗璞″浘锛屾爣璁版墍鏈夊彲杈惧璞★紝骞惰绠楀悇涓猂egion鐨勫洖鏀朵环鍊笺 + 3. **鏈缁堟爣璁帮紙Final Mark锛**锛歋TW锛屽鐞嗗苟鍙戞爣璁版湡闂村璞″紩鐢ㄥ叧绯诲彉鍖栫殑閮ㄥ垎銆 + 4. **绛涢夊洖鏀讹紙Cleanup锛**锛歋TW锛屾牴鎹苟鍙戞爣璁扮殑缁撴灉锛岀瓫閫夊嚭鍥炴敹浠峰奸珮銆佷笖棰勮鍋滈】鏃堕棿婊¤冻瑕佹眰鐨凴egion闆嗗悎锛岃繘琛屽洖鏀躲傚洖鏀舵椂锛屽皢Region涓瓨娲荤殑瀵硅薄澶嶅埗鍒扮┖鐨凴egion涓紝骞舵竻闄よ鍥炴敹Region鐨勭┖闂淬傝繖涓繃绋嬩細鏁寸悊鍐呭瓨锛屽噺灏戠鐗囥 + * **浼樼己鐐**锛 + * 浼樼偣锛氬彲棰勬祴鐨勫仠椤挎椂闂达紙閫氳繃 `-XX:MaxGCPauseMillis` 璁剧疆鐩爣锛夛紝楂樺悶鍚愰噺锛岃兘鍏呭垎鍒╃敤澶欳PU浼樺娍锛屾湁鏁堣В鍐冲唴瀛樼鐗囬棶棰橈紝鍙墿灞曟уソ锛堥傜敤浜庡ぇ鍐呭瓨锛夈 + * 缂虹偣锛氱浉瀵瑰鏉傦紝鍐呭瓨鍗犵敤绋嶉珮锛堥渶瑕佺淮鎶ゆ暟鎹粨鏋勶級锛屽湪Region鏁伴噺杈冨皯鎴栧璞″ぇ灏忓垎甯冧笉鍧囨椂鍙兘涓嶅CMS銆 +5. 绠鍗曡璇翠綘浜嗚В鐨勭被鍔犺浇鍣紝鍙互鎵撶牬鍙屼翰濮旀淳涔堬紝鎬庝箞鎵撶牬銆 + 绛旓細绫诲姞杞藉櫒璐熻矗灏嗙被鐨勫瓧鑺傜爜鏂囦欢锛.class锛夊姞杞藉埌JVM涓紝骞剁敓鎴愬搴旂殑Class瀵硅薄銆傚父瑙佺殑绫诲姞杞藉櫒鏈夛細 + * **鍚姩绫诲姞杞藉櫒锛圔ootstrap ClassLoader锛**锛氳礋璐e姞杞 `/lib` 鐩綍涓嬫垨琚 `-Xbootclasspath` 鍙傛暟鎸囧畾鐨勬牳蹇冪被搴擄紙濡俽t.jar锛夈傚畠鏄疌/C++瀹炵幇鐨勶紝Java绋嬪簭鏃犳硶鐩存帴鑾峰彇鍏跺紩鐢ㄣ + * **鎵╁睍绫诲姞杞藉櫒锛圗xtension ClassLoader锛**锛氳礋璐e姞杞 `/lib/ext` 鐩綍涓嬫垨琚 `java.ext.dirs` 绯荤粺鍙橀噺鎸囧畾鐨勬墿灞曠被搴撱 + * **搴旂敤绋嬪簭绫诲姞杞藉櫒锛圓pplication ClassLoader / System ClassLoader锛**锛氳礋璐e姞杞 `CLASSPATH` 鐜鍙橀噺鎴 `-classpath` 鎸囧畾鐨勭被璺緞涓嬬殑绫汇傚畠鏄垜浠紪鍐欑殑澶у鏁板簲鐢ㄧ▼搴忕殑榛樿绫诲姞杞藉櫒銆 + * **鑷畾涔夌被鍔犺浇鍣**锛氱户鎵 `java.lang.ClassLoader` 骞堕噸鍐 `findClass`锛堟垨 `loadClass`锛夋柟娉曞疄鐜般 + **鍙屼翰濮旀淳妯″瀷锛圥arent Delegation Model锛**锛氬伐浣滄祦绋嬫槸锛氬鏋滀竴涓被鍔犺浇鍣ㄦ敹鍒颁簡鍔犺浇绫荤殑璇锋眰锛屽畠棣栧厛涓嶄細鑷繁灏濊瘯鍔犺浇锛岃屾槸灏嗚姹傚娲剧粰瀹冪殑鐖剁被鍔犺浇鍣ㄣ傚彧鏈夊綋鐖剁被鍔犺浇鍣ㄥ弽棣堣嚜宸辨棤娉曞畬鎴愬姞杞戒换鍔℃椂锛堝鐖剁被鍔犺浇鍣ㄤ腑涓嶅瓨鍦ㄨ绫伙級锛屽瓙绫诲姞杞藉櫒鎵嶄細灏濊瘯鑷繁鍘诲姞杞姐 + **鎵撶牬鍙屼翰濮旀淳**锛氬彲浠ユ墦鐮达紝浣嗛渶瑕佹墜鍔ㄥ共棰勩傚父瑙佺殑鏂规硶鏈夛細 + * **閲嶅啓 `loadClass` 鏂规硶**锛氬湪鑷畾涔夌被鍔犺浇鍣ㄤ腑锛屼笉閬靛惊鍙屼翰濮旀淳鐨勯昏緫锛岀洿鎺ヨ皟鐢 `findClass` 鏂规硶杩涜鍔犺浇銆 + * **閲嶅啓 `findClass` 鏂规硶**锛氳繖鏄洿鎺ㄨ崘鐨勬柟寮忋傚湪鑷畾涔夌被鍔犺浇鍣ㄧ殑 `findClass` 鏂规硶涓疄鐜拌嚜宸辩殑鍔犺浇閫昏緫锛堝浠庣綉缁溿佹暟鎹簱绛夐潪鏍囧噯浣嶇疆鍔犺浇锛夛紝骞剁‘淇濆湪鎵句笉鍒扮被鏃舵姏鍑 `ClassNotFoundException`锛岃繖鏍疯皟鐢ㄩ摼涓婄殑鍏朵粬鍔犺浇鍣紙鍖呮嫭鐖跺姞杞藉櫒锛夎繕鏈夋満浼氬皾璇曞姞杞姐 + * **浣跨敤 `ClassLoader#loadClass(String, boolean)` 鐨 `resolve` 鍙傛暟**锛氳櫧鐒朵笉鐩存帴鎵撶牬妯″瀷锛屼絾鍙互鎺у埗鏄惁瑙f瀽绫汇 + * **绾跨▼涓婁笅鏂囩被鍔犺浇鍣紙Thread Context ClassLoader锛**锛氶氳繃 `Thread.setContextClassLoader()` 璁剧疆锛屽彲浠ュ湪绫诲姞杞介摼璺腑鎻掑叆涓涓笉鍚岀殑鍔犺浇鍣ㄣ備緥濡傦紝JNDI鏈嶅姟浣跨敤瀹冩潵鍔犺浇璧勬簮锛屾墦鐮翠簡SPI锛圫ervice Provider Interface锛夊満鏅笅榛樿鐨勫弻浜插娲鹃檺鍒躲 +6. JVM鍐呭瓨涓轰粈涔堣鍒嗘垚鏂扮敓浠o紝鑰佸勾浠o紝鎸佷箙浠c傛柊鐢熶唬涓负浠涔堣鍒嗕负Eden鍜孲urvivor銆 + 绛旓細 + * **涓轰粈涔堝垎鏂扮敓浠e拰鑰佸勾浠**锛 + * **瀵硅薄鐢熷懡鍛ㄦ湡宸紓**锛氬ぇ澶氭暟瀵硅薄鍦ㄥ垱寤哄悗寰堝揩灏变細鍙樺緱涓嶅彲杈撅紙鐭懡瀵硅薄锛夛紝鍙湁灏戦噺瀵硅薄浼氬瓨娲诲緢闀挎椂闂达紙闀垮懡瀵硅薄锛夈傚垎浠f敹闆嗗彲浠ラ拡瀵逛笉鍚岀敓鍛藉懆鏈熺殑瀵硅薄閲囩敤涓嶅悓鐨勫洖鏀剁瓥鐣ワ紝鎻愰珮鏁堢巼銆 + * **鍥炴敹鏁堢巼**锛氭柊鐢熶唬瀵硅薄瀵嗗害楂橈紙寰堝鏄瀮鍦撅級锛岄傚悎浣跨敤澶嶅埗绠楁硶锛圕opying锛夛紝閫熷害蹇傝佸勾浠e璞″瘑搴︿綆锛堝ぇ閮ㄥ垎鏄椿瀵硅薄锛夛紝閫傚悎浣跨敤鏍囪-娓呴櫎锛圡ark-Sweep锛夋垨鏍囪-鏁寸悊锛圡ark-Compact锛夌畻娉曪紝鍑忓皯鍐呭瓨娴垂銆 + * **鍑忓皯Full GC棰戠巼**锛氬皢闀垮懡瀵硅薄绉诲埌鑰佸勾浠o紝鍙互鍑忓皯瀹冧滑琚绻佹壂鎻忓拰鍥炴敹鐨勫紑閿锛岄檷浣嶧ull GC鐨勯鐜囥 + * **涓轰粈涔堟柊鐢熶唬鍒咵den鍜孲urvivor**锛 + * **澶嶅埗绠楁硶鐨勫疄鐜**锛氭柊鐢熶唬涓昏浣跨敤澶嶅埗绠楁硶銆傚皢鏂扮敓浠e垎涓篍den鍜屼袱鍧楀ぇ灏忕浉鍚岀殑Survivor绌洪棿锛屾瘡娆″垎閰嶅璞℃椂閮藉湪Eden鍖鸿繘琛屻傚綋Eden鍖烘弧鏃惰Е鍙慚inor GC锛屽皢Eden鍜屼竴鍧桽urvivor涓瓨娲荤殑瀵硅薄澶嶅埗鍒板彟涓鍧楃┖鐨凷urvivor涓紝骞舵竻鐞嗘帀Eden鍜屽師Survivor銆傚瓨娲荤殑瀵硅薄骞撮緞澧炲姞锛岃揪鍒颁竴瀹氬勾榫勶紙榛樿15锛岀敱 `-XX:MaxTenuringThreshold` 鎺у埗锛夌殑瀵硅薄浼氳鏅嬪崌鍒拌佸勾浠c + * **绌洪棿鏁堢巼**锛氫换浣曟椂鍊欓兘淇濊瘉鏈変竴鍧桽urvivor鏄┖鐨勶紝浣滀负涓嬫GC鏃剁殑澶嶅埗鐩爣锛岄伩鍏嶄簡棰戠箒鐨勫唴瀛樺垎閰嶅拰鏁寸悊銆傜悊璁轰笂鍙湁10%鐨勭┖闂磋鈥滄氮璐光濓紙鍥犱负Survivor鍖哄崰鏂扮敓浠g殑1/10锛夛紝浣嗚兘楂樻晥澶勭悊澶ч噺鐭懡瀵硅薄鐨勫垱寤哄拰鍥炴敹銆 + * **瀵硅薄骞撮緞绠$悊**锛歋urvivor鍖哄彲浠ョ敤鏉ヨ褰曞璞$殑瀛樻椿鏃堕棿锛屼负瀵硅薄鏅嬪崌鍒拌佸勾浠f彁渚涗緷鎹 +7. JVM 鍑虹幇 fullGC 寰堥绻侊紝鎬庝箞鍘荤嚎涓婃帓鏌ラ棶棰橈紵 + 绛旓細鎺掓煡棰戠箒Full GC鐨勬楠わ細 + * **鏀堕泦GC鏃ュ織**锛氱‘淇滼VM寮鍚簡GC鏃ュ織鍔熻兘锛屼緥濡傦細`-Xlog:gc*=info:file=/path/to/gc.log:time,uptime,level,tags`銆傛棩蹇楁枃浠惰褰曚簡姣忔GC鐨勭被鍨嬨佽楁椂銆佸爢鍐呭瓨鍙樺寲绛変俊鎭 + * **鍒嗘瀽GC鏃ュ織**锛氫娇鐢ㄥ伐鍏凤紙濡 `jcmd GC.print_heap_at_gc`, `jstat -gcutil `, 鎴栦笓闂ㄧ殑鏃ュ織鍒嗘瀽宸ュ叿濡侴CEasy, GCViewer锛夊垎鏋愭棩蹇椼 + * 鏌ョ湅Full GC鐨勮Е鍙戝師鍥狅細鏄佸勾浠g┖闂翠笉瓒筹紵姘镐箙浠/鍏冪┖闂寸┖闂翠笉瓒筹紵杩樻槸System.gc()琚皟鐢紵鎴栨槸CMS鐨凜oncurrent Mode Failure锛堝苟鍙戞ā寮忓け璐ワ級鎴朠romotion Failed锛堟檵鍗囧け璐ワ級锛 + * 瑙傚療鑰佸勾浠c佹柊鐢熶唬銆佹案涔呬唬/鍏冪┖闂寸殑浣跨敤瓒嬪娍锛屽垽鏂槸鍝釜鍖哄煙瀵艰嚧鐨勯棶棰樸 + * 璁$畻Full GC鐨勫钩鍧囬棿闅旀椂闂村拰鑰楁椂锛岃瘎浼板奖鍝嶃 + * **鐢熸垚Heap Dump**锛氬湪Full GC鍙戠敓鏃舵垨涔嬪悗锛屼娇鐢 `-XX:+HeapDumpOnOutOfMemoryError` 鎴栨墜鍔ㄤ娇鐢 `jmap -dump:live,format=b,file=heap.hprof ` 鐢熸垚鍫嗚浆鍌ㄥ揩鐓с + * **鍒嗘瀽Heap Dump**锛氫娇鐢∕AT锛圗clipse Memory Analyzer Tool锛夈乂isualVM銆丣Profiler绛夊伐鍏峰姞杞紿eap Dump銆 + * 鏌ユ壘鍐呭瓨娉勬紡锛氶氳繃Dominator Tree鎴 Leak Suspects 鎶ュ憡锛屾壘鍑哄崰鐢ㄥ唴瀛樻渶澶氱殑瀵硅薄鍙婂叾寮曠敤閾撅紝鍒ゆ柇鏄惁鏈夊璞℃湰搴旇鍥炴敹浣嗚闀挎湡鎸佹湁寮曠敤銆 + * 妫鏌ュぇ瀵硅薄锛氭煡鎵惧崰鐢ㄧ┖闂寸壒鍒ぇ鐨勫璞★紝鍒ゆ柇鏄惁鏄甯镐笟鍔¢渶姹傝繕鏄紓甯镐骇鐢熴 + * 妫鏌ョ嚎绋嬫爤锛氭湁鏃剁嚎绋嬮暱鏃堕棿鎸佹湁閿佹垨澶勪簬鏌愮鐘舵佷篃浼氶棿鎺ュ鑷村唴瀛橀棶棰樸 + * **妫鏌ヤ唬鐮佸拰閰嶇疆**锛 + * 浠g爜灞傞潰锛氭鏌ユ槸鍚︽湁闈欐侀泦鍚堢被闀挎湡鎸佹湁瀵硅薄寮曠敤銆佸ぇ瀵硅薄鍒涘缓鍚庢湭閲婃斁銆佺紦瀛樻満鍒惰璁′笉鍚堢悊銆佺嚎绋嬫硠婕忕瓑闂銆 + * 閰嶇疆灞傞潰锛氭鏌ュ爢鍐呭瓨澶у皬锛 `-Xms`, `-Xmx`锛夋槸鍚﹁缃繃灏忥紱鑰佸勾浠c佹柊鐢熶唬姣斾緥鏄惁鍚堢悊锛汼urvivor鍖烘瘮渚嬫槸鍚﹀悎閫傦紱GC绠楁硶閫夋嫨鏄惁閫傚悎褰撳墠搴旂敤鍦烘櫙锛涘厓绌洪棿澶у皬锛 `-XX:MetaspaceSize`, `-XX:MaxMetaspaceSize`锛夋槸鍚﹁冻澶熴 + * **鐩戞帶鎸囨爣**锛氱粨鍚堢郴缁熺洃鎺э紙濡侰PU銆佸唴瀛樸佺嚎绋嬫暟锛夊拰搴旂敤鐩戞帶锛堝璇锋眰閲忋佸搷搴旀椂闂达級锛岀湅Full GC鏄惁涓庣壒瀹氭搷浣滄垨楂樺嘲鏈熺浉鍏炽 +8. JVM涓竴娆″畬鏁寸殑GC娴佺▼鏄庢牱鐨勶紝瀵硅薄濡備綍鏅嬪崌鍒拌佸勾浠o紝璇磋浣犵煡閬撶殑鍑犵涓昏鐨凧VM鍙傛暟銆 + 绛旓細 + * **涓娆″畬鏁寸殑GC娴佺▼**锛氶氬父鎸囦粠Minor GC鍒板彲鑳借Е鍙慒ull GC鐨勮繃绋嬨 + 1. **Minor GC**锛氬湪鏂扮敓浠g┖闂达紙涓昏鏄疎den鍖猴級婊℃椂瑙﹀彂銆侴C绾跨▼浼氭殏鍋滅敤鎴风嚎绋嬶紙STW锛夛紝鎵弿Eden鍖哄拰From Survivor鍖猴紝灏嗗瓨娲荤殑瀵硅薄澶嶅埗鍒癟o Survivor鍖猴紝骞舵竻鐞咵den鍖哄拰From Survivor鍖恒傚瓨娲诲璞″勾榫+1銆傚鏋滃璞″勾榫勮揪鍒伴槇鍊硷紝鍒欐檵鍗囧埌鑰佸勾浠c + 2. **Major GC / Full GC**锛氶氬父鍦ㄤ互涓嬫儏鍐佃Е鍙戯細 + * 鑰佸勾浠g┖闂翠笉瓒筹紙濡傛柊鐢熶唬瀵硅薄鏅嬪崌瀵艰嚧鑰佸勾浠f弧锛夈 + * 姘镐箙浠/鍏冪┖闂寸┖闂翠笉瓒炽 + * System.gc()琚皟鐢紙寤鸿锛岄潪寮哄埗锛夈 + * CMS GC涓殑Concurrent Mode Failure鎴朠romotion Failed銆 + * 缁熻寰楀埌鐨凪inor GC鏅嬪崌鍒拌佸勾浠g殑骞冲潎澶у皬澶т簬鑰佸勾浠g殑鍓╀綑绌洪棿銆 + Full GC浼氭壂鎻忔暣涓爢锛堟柊鐢熶唬鍜岃佸勾浠o級锛屽苟鍙兘杩涜鏁寸悊锛堝彇鍐充簬GC绠楁硶锛夛紝鑰楁椂杈冮暱锛屼細瀵艰嚧杈冮暱鏃堕棿鐨凷TW銆 + * **瀵硅薄濡備綍鏅嬪崌鍒拌佸勾浠**锛 + * **骞撮緞闃堝**锛氬湪Survivor鍖轰腑锛屽璞℃瘡鐔繃涓娆inor GC锛屽勾榫勫氨鍔1銆傚綋骞撮緞杈惧埌涓瀹氬硷紙榛樿15锛岀敱 `-XX:MaxTenuringThreshold` 璁剧疆锛夛紝鍦ㄤ笅娆inor GC鏃跺氨浼氳澶嶅埗鍒拌佸勾浠c + * **澶у璞$洿鎺ヨ繘鍏ヨ佸勾浠**锛氬浜庝竴浜涘緢澶х殑瀵硅薄锛堣秴杩 `-XX:PretenureSizeThreshold` 璁剧疆鐨勫ぇ灏忥級锛屼负浜嗛伩鍏嶅湪Survivor鍖轰箣闂村鍒跺甫鏉ョ殑鎬ц兘寮閿锛屼細鐩存帴鍦ㄦ柊鐢熶唬GC鏃跺垎閰嶅埌鑰佸勾浠c + * **鍔ㄦ佸勾榫勫垽瀹**锛欽VM骞朵笉鎬绘槸涓ユ牸鎸夌収骞撮緞闃堝笺傚畠浼氱粺璁urvivor鍖轰腑鍚勪釜骞撮緞瀵硅薄鍗犵敤鐨勬诲ぇ灏忥紝濡傛灉鏌愪釜骞撮緞鐨勬墍鏈夊璞$殑鎬诲ぇ灏忓ぇ浜嶴urvivor鍖虹殑涓鍗婏紝閭d箞澶т簬鎴栫瓑浜庤骞撮緞鐨勬墍鏈夊璞″皢鐩存帴杩涘叆鑰佸勾浠o紝鍗充娇瀹冧滑鐨勫勾榫勮繕娌¤揪鍒伴槇鍊笺 + * **涓昏鐨凧VM鍙傛暟**锛 + * **鍫嗗唴瀛樼浉鍏**锛 + * `-Xms`锛氬垵濮嬪爢澶у皬銆 + * `-Xmx`锛氭渶澶у爢澶у皬銆 + * `-Xmn`锛氭柊鐢熶唬澶у皬锛堥氬父鑰佸勾浠eぇ灏 = MaxHeapSize - NewSize锛夈 + * `-XX:NewRatio=`锛氳佸勾浠/鏂扮敓浠g殑姣斾緥锛堥粯璁2锛屽嵆鑰佸勾浠:鏂扮敓浠=2:1锛夈 + * `-XX:SurvivorRatio=`锛欵den/Survivor鐨勬瘮渚嬶紙榛樿8锛屽嵆Eden:Survivor=8:1锛夈 + * `-XX:MaxTenuringThreshold=`锛氬璞℃檵鍗囪佸勾浠g殑鏈澶у勾榫勶紙榛樿15锛夈 + * `-XX:PretenureSizeThreshold=`锛氬ぇ浜庢澶у皬鐨勫璞$洿鎺ュ垎閰嶅湪鑰佸勾浠o紙浠呭Serial鍜孭arallel Scavenge GC鏈夋晥锛夈 + * **GC鐩稿叧**锛 + * `-XX:+UseSerialGC`锛氫娇鐢⊿erial GC銆 + * `-XX:+UseParNewGC`锛氫娇鐢≒arNew GC锛堟柊鐢熶唬骞惰锛夈 + * `-XX:+UseParallelGC` / `-XX:+UseParallelOldGC`锛氫娇鐢≒arallel Scavenge / Parallel Old GC銆 + * `-XX:+UseConcMarkSweepGC`锛氫娇鐢–MS GC銆 + * `-XX:+UseG1GC`锛氫娇鐢℅1 GC銆 + * `-XX:MaxGCPauseMillis=