Java基础知识八股

本文探讨了静态方法无法调用非静态方法的原因,Java中非静态内部类导致内存泄露的机制及其解决方案,以及如何处理ThreadLocal内存泄漏并提供JVM内存调优策略。
摘要由CSDN通过智能技术生成

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越频繁

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 八股文知识点是 Java 学习过程中比较基础和重要的知识点,也是在面试过程中常会被问到的问题。 1. Java 基础语法 Java 基础语法包括数据类型、变量、运算符、流程控制、方法等。学习 Java 编程的第一步就是要掌握这些基础语法知识。 2. 面向对象编程 Java 是一种面向对象的编程语言,因此掌握面向对象编程的基本概念和技术是非常重要的。比如类、对象、封装、继承、多态等。 3. 异常处理 在 Java 编程中,异常处理是必不可少的。学习 Java 八股文之前,需要掌握异常的基本概念和处理机制。 4. 集合类 Java 提供了大量的集合类库,包括 List、Set、Map 等。这些集合类能够方便快捷地存储和操作数据。Java 八股文中通常会对集合类的使用和操作技巧进行考察。 5. IO 流 Java 中的 IO 流提供了对输入和输出的支持。掌握 IO 流的使用方法是 Java 编程的必备技能。 6. 多线程 多线程编程是 Java 开发中的一个重要部分。Java 八股文中经常会出现多线程相关的考题,需要掌握线程的创建、同步、协作等技术。 7. JDBC 数据库操作 Java 提供了 JDBC API 来操作数据库。学习 JDBC 数据库操作是掌握 Java 后端开发的必备技能。 总体来看,Java 八股文通常会涉及到 Java 基础语法、面向对象编程、异常处理、集合类、IO 流、多线程和 JDBC 数据库操作等方面的知识。掌握这些知识有助于我们更好地理解和应用 Java 编程语言

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值