一位Java大牛的BAT面试心得与经验总结
2021/6/8 14:22:13
本文主要是介绍一位Java大牛的BAT面试心得与经验总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
- JVM 内存模型一共包括三个部分:
- 堆 ( Java代码可及的 Java堆 和 JVM自身使用的方法区)、
- 栈 ( 服务Java方法的虚拟机栈 和 服务Native方法的本地方法栈 )
- 保证程序在多线程环境下能够连续执行的程序计数器
特别地,我们当时就提到Java堆是进行垃圾回收的主要区域,故其也被称为GC堆;而方法区也有一个不太严谨的表述,就是永久代。总的来说,堆 (包括Java堆 和 方法区)是 垃圾回收的主要对象,特别是Java堆。
实际上,Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的堆区。关于对象分配内存问题,笔者的博文《JVM 内存模型概述》已经阐述了 如何划分可用空间及其涉及到的线程安全问题,本文将结合垃圾回收策略进一步给出 内存分配规则。另外,我们知道垃圾回收机制是Java语言一个显著的特点,其可以有效的防止内存泄露、保证内存的有效使用,从而使得Java程序员在编写程序的时候不再需要考虑内存管理问题。Java 垃圾回收机制要考虑的问题很复杂,本文阐述了其三个核心问题
1. Java 堆空间
**发生频率:**5颗星
造成原因
-
无法在 Java 堆中分配对象
-
吞吐量增加
-
应用程序无意中保存了对象引用,对象无法被 GC 回收
-
应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。finalizer 由结束队列服务的守护线程调用,有时 finalizer 线程的处理能力无法跟上结束队列的增长
解决方案
单位对应:GB -> G, g;MB -> M, m;KB -> K, k
-
使用 -Xmx 增加堆大小
-
修复应用程序中的内存泄漏
2. GC 开销超过限制
**发生频率:**5颗星
造成原因
- Java 进程98%的时间在进行垃圾回收,恢复了不到2%的堆空间,最后连续5个(编译时常量)垃圾回收一直如此。
解决方案
-
使用 -Xmx 增加堆大小
-
使用 -XX:-UseGCOverheadLimit 取消 GC 开销限制
-
修复应用程序中的内存泄漏
3. 请求的数组大小超过虚拟机限制
**发生频率:**2颗星
造成原因
- 应用程序试图分配一个超过堆大小的数组
解决方案
-
使用 -Xmx 增加堆大小
-
修复应用程序中分配巨大数组的 bug
4. Perm gen 空间
**发生频率:**3颗星
造成原因
Perm gen 空间包含:
-
类的名字、字段、方法
-
与类相关的对象数组和类型数组
-
JIT 编译器优化
当 Perm gen 空间用尽时,将抛出异常。
解决方案
-
使用 -XX: MaxPermSize 增加 Permgen 大小
-
不重启应用部署应用程序可能会导致此问题。重启 JVM 解决
5. Metaspace
**发生频率:**3颗星
造成原因
- 从 Java 8 开始 Perm gen 改成了 Metaspace,在本机内存中分配 class 元数据(称为 metaspace)。如果 metaspace 耗尽,则抛出异常
解决方案
-
通过命令行设置 -XX: MaxMetaSpaceSize 增加 metaspace 大小
-
取消 -XX: maxmetsspacedize
-
减小 Java 堆大小,为 MetaSpace 提供更多的可用空间
-
为服务器分配更多的内存
-
可能是应用程序 bug,修复 bug
6. 无法新建本机线程
**发生频率:**5颗星
造成原因
- 内存不足,无法创建新线程。由于线程在本机内存中创建,报告这个错误表明本机内存空间不足
解决方案
-
为机器分配更多的内存
-
减少 Java 堆空间
-
修复应用程序中的线程泄漏。
-
增加操作系统级别的限制
-
ulimit -a
-
用户进程数增大 (-u) 1800
- 使用 -Xss 减小线程堆栈大小
7. 杀死进程或子进程
**发生频率:**1颗星
造成原因
- 内核任务:内存不足结束器,在可用内存极低的情况下会杀死进程
解决方案
-
将进程迁移到不同的机器上
-
给机器增加更多内存
与其他 OOM 错误不同,这是由操作系统而非 JVM 触发的。
8. 发生 stack_trace_with_native_method
**发生频率:**1颗星
造成原因
-
本机方法(native method)分配失败
-
打印的堆栈跟踪信息,最顶层的帧是本机方法
解决方案
使用操作系统本地工具进行诊断
总结
在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了,有需要的朋友可以**【转发+关注】后点击这里免费领取!**
ring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了,有需要的朋友可以**【转发+关注】后点击这里免费领取!**
[外链图片转存中…(img-1nboAGB3-1623127358217)]
这篇关于一位Java大牛的BAT面试心得与经验总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南