Java基础知识八股

1.为什么静态方法无法调用非静态方法?

回答:因为静态方法是随着类的加载而加载,而非静态方法则是随着类的实例化才会被加载,生存周期不一样,所以静态方法的生命周期更长

2.Java--内部类持有外部类导致内存泄露的原因和解决方案

原因:非静态内部类持有外部类的时候,如果有的地方引用了内部类,会导致这个外部类也会被引用,即使后期外部类没有用,但是仍然无法进行回收。

解决方法、

  1. 不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务。
  2. 将非静态内部类改为静态内部类。
    1. 内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到static类型的引用

为什么使用:

  1. 当内部类只在外部类中使用时,匿名内部类可以让外部不知道它的存在,从而减少了代码的维护工作。

  2. 当内部类持有外部类时,它就可以直接使用外部类中的变量了,这样可以很方便的完成调用,如下代码所示:

    复制代码
    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()方法

复制代码
ThreadLocal<Object> threadLocal = new ThreadLocal<>();
try {
    Object value = new Object();
    threadLocal.set(value);
    // do something
} finally {
    threadLocal.remove();
}

2.使用不可变的资源

ThreadLocal变量存储的对象最好是不可变的,因为不可变的对象不需要频繁更新,也不会因为被多个线程同时修改而出现线程安全问题。如果要修改一个ThreadLocal变量中的对象,最好使用一个新的对象替换原有的对象,从而避免引用泄漏的问题。

3.使用弱引用

复制代码
ThreadLocal<Object> threadLocal = new ThreadLocal<Object>() {
    @Override
    protected Object initialValue() {
        return new WeakReference<Object>(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越频繁

相关推荐
Ustinian_31031 分钟前
【C/C++】For 循环展开与性能优化【附代码讲解】
c语言·开发语言·c++
牵牛老人41 分钟前
Qt 插件开发全解析:从接口定义,插件封装,插件调用到插件间的通信
开发语言·qt
钮钴禄·爱因斯晨44 分钟前
AIGC浪潮下,风靡全球的Mcp到底是什么?一文讲懂,技术小白都知道!!
开发语言·人工智能·深度学习·神经网络·生成对抗网络·aigc
22jimmy2 小时前
JavaWeb(二)CSS
java·开发语言·前端·css·入门·基础
机器视觉知识推荐、就业指导4 小时前
面试问题详解五:Qt 信号与槽的动态管理
开发语言·qt
vvilkim5 小时前
Java主流框架全解析:从企业级开发到云原生
java·运维·云原生
MZ_ZXD0016 小时前
springboot汽车租赁服务管理系统-计算机毕业设计源码58196
java·c++·spring boot·python·django·flask·php
A 计算机毕业设计-小途6 小时前
大四零基础用Vue+ElementUI一周做完化妆品推荐系统?
java·大数据·hadoop·python·spark·毕业设计·毕设
岁忧8 小时前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先
四维碎片10 小时前
【Qt】线程池与全局信号实现异步协作
开发语言·qt·ui·visual studio