用jsp做網(wǎng)站互聯(lián)網(wǎng)電商平臺
1.為什么靜態(tài)方法無法調(diào)用非靜態(tài)方法?
回答:因?yàn)殪o態(tài)方法是隨著類的加載而加載,而非靜態(tài)方法則是隨著類的實(shí)例化才會被加載,生存周期不一樣,所以靜態(tài)方法的生命周期更長
2.Java–內(nèi)部類持有外部類導(dǎo)致內(nèi)存泄露的原因和解決方案
原因:非靜態(tài)內(nèi)部類持有外部類的時候,如果有的地方引用了內(nèi)部類,會導(dǎo)致這個外部類也會被引用,即使后期外部類沒有用,但是仍然無法進(jìn)行回收。
解決方法、
- 不要讓其他的地方持有這個非靜態(tài)內(nèi)部類的引用,直接在這個非靜態(tài)內(nèi)部類執(zhí)行業(yè)務(wù)。
- 將非靜態(tài)內(nèi)部類改為靜態(tài)內(nèi)部類。
- 內(nèi)部類改為靜態(tài)的之后,它所引用的對象或?qū)傩砸脖仨毷庆o態(tài)的,所以靜態(tài)內(nèi)部類無法獲得外部對象的引用,只能從 JVM 的 Method Area(方法區(qū))獲取到static類型的引用
為什么使用:
- 當(dāng)內(nèi)部類只在外部類中使用時,匿名內(nèi)部類可以讓外部不知道它的存在,從而減少了代碼的維護(hù)工作。
- 當(dāng)內(nèi)部類持有外部類時,它就可以直接使用外部類中的變量了,這樣可以很方便的完成調(diào)用,如下代碼所示:
package org.example.a;class Outer{private String outerName = "Tony";class Inner{private String name;public Inner() {this.name = outerName;}}Inner createInner() {return new Inner();} }public class Demo {public static void main(String[] args) {Outer.Inner inner = new Outer().createInner();System.out.println(inner);} }
3.ThreadLocal出現(xiàn)內(nèi)存泄漏的原因及怎么解決
原因:
1.ThreadLocal變量沒有被明確的移除。在使用ThreadLocal時,當(dāng)線程結(jié)束,如果ThreadLocal變量沒有被手動清除,就會導(dǎo)致這部分內(nèi)存無法被回收,最終導(dǎo)致內(nèi)存泄漏。
2.ThreadLocal變量一直存在于ThreadLocalMap中。每個線程都有一個ThreadLocalMap,這個Map可以存放多個ThreadLocal變量。當(dāng)ThreadLocal變量沒有被移除時,它所引用的對象也會一直存放在線程的ThreadLocalMap中,這會導(dǎo)致ThreadLocalMap變得很大,從而占用大量的內(nèi)存空間,最終導(dǎo)致內(nèi)存泄漏。
解決方法:
1.使用ThreadLocal.remove()方法
ThreadLocal<Object> threadLocal = new ThreadLocal<>();
try {Object value = new Object();threadLocal.set(value);// do something
} finally {threadLocal.remove();
}
2.使用不可變的資源?
ThreadLocal變量存儲的對象最好是不可變的,因?yàn)椴豢勺兊膶ο蟛恍枰l繁更新,也不會因?yàn)楸欢鄠€線程同時修改而出現(xiàn)線程安全問題。如果要修改一個ThreadLocal變量中的對象,最好使用一個新的對象替換原有的對象,從而避免引用泄漏的問題。
3.使用弱引用
ThreadLocal<Object> threadLocal = new ThreadLocal<Object>() {@Overrideprotected Object initialValue() {return new WeakReference<Object>(new Object());}
};
?4.JVM調(diào)優(yōu)
原因:
Heap內(nèi)存(老年代)持續(xù)上漲達(dá)到設(shè)置的最大內(nèi)存值;
Full GC 次數(shù)頻繁;
GC 停頓時間過長(超過1秒);
應(yīng)用出現(xiàn)OutOfMemory等內(nèi)存異常;
應(yīng)用中有使用本地緩存且占用大量內(nèi)存空間;
系統(tǒng)吞吐量與響應(yīng)性能不高或不降。
調(diào)優(yōu):
java heap:參數(shù)-Xms(設(shè)置內(nèi)存)和-Xmx(設(shè)置堆),建議擴(kuò)大至3-4倍FullGC后的老年代空間占用。
永久代:-XX:PermSize和-XX:MaxPermSize,建議擴(kuò)大至1.2-1.5倍FullGc后的永久代空間占用。
新生代:-Xmn,建議擴(kuò)大至1-1.5倍FullGC之后的老年代空間占用。
老年代:2-3倍FullGC后的老年代空間占用。
新生代越大,minorGC越久,越小,minorGC越頻繁