网站建设类文章要发多少片,怎么做网站 白,腾讯企业邮箱pc版入口,郴州网站建设找哪家公司1.为什么静态方法无法调用非静态方法#xff1f;
回答#xff1a;因为静态方法是随着类的加载而加载#xff0c;而非静态方法则是随着类的实例化才会被加载#xff0c;生存周期不一样#xff0c;所以静态方法的生命周期更长 2.Java–内部类持有外部类导致内存泄露的原因和…1.为什么静态方法无法调用非静态方法
回答因为静态方法是随着类的加载而加载而非静态方法则是随着类的实例化才会被加载生存周期不一样所以静态方法的生命周期更长 2.Java–内部类持有外部类导致内存泄露的原因和解决方案
原因非静态内部类持有外部类的时候如果有的地方引用了内部类会导致这个外部类也会被引用即使后期外部类没有用但是仍然无法进行回收。
解决方法、
不要让其他的地方持有这个非静态内部类的引用直接在这个非静态内部类执行业务。将非静态内部类改为静态内部类。 内部类改为静态的之后它所引用的对象或属性也必须是静态的所以静态内部类无法获得外部对象的引用只能从 JVM 的 Method Area方法区获取到static类型的引用
为什么使用
当内部类只在外部类中使用时匿名内部类可以让外部不知道它的存在从而减少了代码的维护工作。当内部类持有外部类时它就可以直接使用外部类中的变量了这样可以很方便的完成调用如下代码所示 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出现内存泄漏的原因及怎么解决
原因
1.ThreadLocal变量没有被明确的移除。在使用ThreadLocal时当线程结束如果ThreadLocal变量没有被手动清除就会导致这部分内存无法被回收最终导致内存泄漏。
2.ThreadLocal变量一直存在于ThreadLocalMap中。每个线程都有一个ThreadLocalMap这个Map可以存放多个ThreadLocal变量。当ThreadLocal变量没有被移除时它所引用的对象也会一直存放在线程的ThreadLocalMap中这会导致ThreadLocalMap变得很大从而占用大量的内存空间最终导致内存泄漏。
解决方法
1.使用ThreadLocal.remove()方法
ThreadLocalObject threadLocal new ThreadLocal();
try {Object value new Object();threadLocal.set(value);// do something
} finally {threadLocal.remove();
}
2.使用不可变的资源
ThreadLocal变量存储的对象最好是不可变的因为不可变的对象不需要频繁更新也不会因为被多个线程同时修改而出现线程安全问题。如果要修改一个ThreadLocal变量中的对象最好使用一个新的对象替换原有的对象从而避免引用泄漏的问题。
3.使用弱引用
ThreadLocalObject threadLocal new ThreadLocalObject() {Overrideprotected Object initialValue() {return new WeakReferenceObject(new Object());}
}; 4.JVM调优
原因
Heap内存老年代持续上涨达到设置的最大内存值
Full GC 次数频繁
GC 停顿时间过长超过1秒
应用出现OutOfMemory等内存异常
应用中有使用本地缓存且占用大量内存空间
系统吞吐量与响应性能不高或不降。
调优
java heap参数-Xms设置内存和-Xmx设置堆建议扩大至3-4倍FullGC后的老年代空间占用。 永久代-XX:PermSize和-XX:MaxPermSize建议扩大至1.2-1.5倍FullGc后的永久代空间占用。 新生代-Xmn建议扩大至1-1.5倍FullGC之后的老年代空间占用。 老年代2-3倍FullGC后的老年代空间占用。
新生代越大minorGC越久越小minorGC越频繁