面试官问「如何有效减少 Java 内存占用过高的情况」,该如何作答?

5 个回答

  • 周武王
    满心期待必有所失,人无贪念便有馈赠。
    1.尽量在合适的场合使用单例 2.尽量避免随意使用静态变量 3.尽量避免过多过常的创建 Java 对象 4.尽量使用 final 修饰符 5.尽量使用局部变量 6.尽量处理好包装类型和基本类型两者的使用场所 7.慎用 synchronized,尽量减小 synchronize 的方法 8.尽量使用 StringBuilder 和 StringBuffer 进行字符串连接 9.尽量不要使用 finalize 方法 10.尽量使用基本数据类型代替对象 11.单线程应尽量使用 HashMap、ArrayList 12.尽量合理的创建 HashMap 13.尽量减少对变量的重复计算 14.尽量避免不必要的创建 15.尽量在 finally 块中释放资源 16.尽量使用移位来代替’a/b’的操作 17.尽量使用移位来代替’a*b’的操作 19.尽量早释放无用对象 20.尽量避免使用二维数组 二维数据占用的内存空间比一维数组多得多,大概 10 倍以上。 21.尽量避免使用 split 除非是必须的,否则应该避免使用 split,split 由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用 split,可以考虑使用 apache 的 StringUtils.split(string,char),频繁 split 的可以缓存结果。 22.ArrayList&LinkedList 一个是线性表,一个是链表,一句话,随机查询尽量使用 ArrayList,ArrayList 优于 LinkedList,LinkedList 还要移动指针,添加删除的操作 LinkedList 优于 ArrayList,ArrayList 还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好 2者得数据结构,对症下药。 23.尽量使用 System.arraycopy()代替通过来循环复制数组 System.arraycopy()要比通过循环来复制数组快的多 24.尽量缓存经常使用的对象 25.尽量避免非常大的内存分配 26.慎用异常
    发布于 2025-01-23 01:27 •IP属地 安徽
    举报
    评论
    收藏

  • java小生
    见过花就好,何必在意花属于谁。
    这个涉及到 jvm 调优的问题,java 内存过高可能就需要定位是什么原因导致的,回答他可以从 jvm 和 jmm 来回答他,占用的对象过大还是 jvm 参数设置的不合理,还有找到对应的线程,代码和对应的 sql 和代码尝试的去避免触发类加载的 jvm 关键字比如new,getStatic 等还有还有执行的 sql,根据执行计划或者其他来优化 sql 这个从 jvm 和 jmm 来回答他,jvm 内存是指的运行时数据区,分为堆内存,栈内存,方法区,告诉他初始化的对象都放在栈内存,对象的引用在栈内存,栈内存主要负责 java 程序的运行,栈在线程创建时被创建,栈是线程私有的,也就是说每一个线程都有自己的栈空间,线程之间的运行不受影响,相互独立,栈内存中存储的基本单位是栈帧,JVM 只对栈帧进行进栈出栈操作,栈帧中的数据它不管,调用一个方法就压入一帧,栈帧在方法运行时被创建,栈帧存放的数据主要包括局部变量表,操作数栈,动态链接,方法返回,附加信息五大内容,动态链接就是运行时常量的引用:在一个 class 文件中,一个方法要调用其他方法,需要将这些方法的符号引用转化为其在内存地址中的直接引用,而符号引用存在于方法区中的运行时常量池。运行时常量池用于存放编译期生成的各种字面量和符号引用。但是,Java 语言并不要求常量只有在编译期才能产生。比如在运行期,String.intern 也会把新的常量放入池中。局部变量表中存放的数据类型主要是包括 8 大基本数据类型,对象的引用类型(不是对象,对象在堆内存中),所以还是一个指向地址的指针,栈内存可以继续细分,分为虚拟机栈,本地方法栈,程序计数器三部分,java 方法分为被 native 修饰和未被 native 修饰,被 native 修饰的方法储存在 native 本地方法栈,未被 native 修饰就被存到 java 虚拟机栈,本地方法栈与虚拟机栈的作用非常相似,虚拟机栈为执行 java 方法服务,本地方法栈为虚拟机中使用到的 Native 方法服务。
    发布于 2025-01-22 14:36 •IP属地 安徽
    举报
    评论
    收藏

  • 菜菜
    世界上有两个我,一个想去远方,一个身不由己。
    1.尽量使用直接量 2.使用 StringBuilder 和 StringBuffer 进行字符串连接 3.尽早释放无用对象的引用 4.尽量少用静态变量 5.避免在经常调用的方法、循环中创建 Java 对象 6.缓存经常使用的对象 7.尽量不要使用 finalize 方法 8.考虑使用 SoftReference
    发布于 2025-01-21 02:54 •IP属地 黑龙江
    举报
    评论
    收藏

  • 莫千绝
    无论什么关系,我看不到我想要的态度。我就不会给你想要的细节。
    面试应该是看你平时写代码的功底 如 arraylist 知道大小要制定大小防止扩容 能用基本类型用基本类型 能用数组不用链表等等吧都可以减少内存的占用 尽量使用局部变量等等
    发布于 2025-01-19 12:17 •IP属地 广东
    举报
    评论
    收藏

  • 丁隐
    不必太张扬,是花自然香。
    1.使用优秀的设计模式,例如单例可以降低多余对象创建的内存开销。 2.尽量用循环代替递归,递归的对象不会及时释放。 3.不要频繁的创建和销毁线程,尽量使用线程池,并且根据实际情况限定好核心线程和非核心线程量。 4.可以适当的根据你的应用占用资源情况,降低gc清理百分比 5.尽可能细化锁原子颗粒度。 6.对流的使用,一定要及时关闭。
    发布于 2025-01-16 05:42 •IP属地 浙江
    举报
    评论
    收藏