黑马 Java八股文面试题视频教程,Java面试八股文宝典(虚拟机篇)

1. JVM 内存结构

要求

  • 掌握 JVM 内存结构划分
  • 尤其要知道方法区、永久代、元空间的关系

结合一段 java 代码的执行理解内存划分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4d6H9a8u-1657505229657)(img/image-20210831165728217.png)]

  • 执行 javac 命令编译源代码为字节码
  • 执行 java 命令
    1. 创建 JVM,调用类加载子系统加载 class,将类的信息存入方法区
    2. 创建 main 线程,使用的内存区域是 JVM 虚拟机栈,开始执行 main 方法代码
    3. 如果遇到了未见过的类,会继续触发类加载过程,同样会存入方法区
    4. 需要创建对象,会使用内存来存储对象
    5. 不再使用的对象,会由垃圾回收器在内存不足时回收其内存
    6. 调用方法时,方法内的局部变量、方法参数所使用的是 JVM 虚拟机栈中的栈帧内存
    7. 调用方法时,先要到方法区获得到该方法的字节码指令,由解释器将字节码指令解释为机器码执行
    8. 调用方法时,会将要执行的指令行号读到程序计数器,这样当发生了线程切换,恢复时就可以从中断的位置继续
    9. 对于非 java 实现的方法调用,使用内存称为本地方法栈(见说明)
    10. 对于热点方法调用,或者频繁的循环代码,由 JIT 即时编译器将这些代码编译成机器码缓存,提高执行性能

说明

  • 加粗字体代表了 JVM 虚拟机组件
  • 对于 Oracle 的 Hotspot 虚拟机实现,不区分虚拟机栈和本地方法栈

会发生内存溢出的区域

  • 不会出现内存溢出的区域 – 程序计数器
  • 出现 OutOfMemoryError 的情况
    • 堆内存耗尽 – 对象越来越多,又一直在使用,不能被垃圾回收
    • 方法区内存耗尽 – 加载的类越来越多,很多框架都会在运行期间动态产生新的类
    • 虚拟机栈累积 – 每个线程最多会占用 1 M 内存,线程个数越来越多,而又长时间运行不销毁时
  • 出现 StackOverflowError 的区域
    • JVM 虚拟机栈,原因有方法递归调用未正确结束、反序列化 json 时循环引用

方法区、永久代、元空间

  • 方法区是 JVM 规范中定义的一块内存区域,用来存储类元数据、方法字节码、即时编译器需要的信息等
  • 永久代是 Hotspot 虚拟机对 JVM 规范的实现(1.8 之前)
  • 元空间是 Hotspot 虚拟机对 JVM 规范的另一种实现(1.8 以后),使用本地内存作为这些信息的存储空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldRrZgb2-1657505229658)(img/image-20210831170457337.png)]

从这张图学到三点

  • 当第一次用到某个类是,由类加载器将 class 文件的类元信息读入,并存储于元空间
  • X,Y 的类元信息是存储于元空间中,无法直接访问
  • 可以用 X.class,Y.class 间接访问类元信息,它们俩属于 java 对象,我们的代码中可以使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aODiXYQO-1657505229659)(img/image-20210831170512418.png)]

从这张图可以学到

  • 堆内存中:当一个类加载器对象,这个类加载器对象加载的所有类对象,这些类对象对应的所有实例对象都没人引用时,GC 时就会对它们占用的对内存进行释放
  • 元空间中:内存释放以类加载器为单位,当堆中类加载器内存释放时,对应的元空间中的类元信息也会释放

2. JVM 内存参数

要求

  • 熟悉常见的 JVM 参数,尤其和大小相关的

堆内存,按大小设置

!](https://img-blog.csdnimg.cn/feffa081370a4cff9747f289648cc498.png)

解释:

  • -Xms 最小堆内存(包括新生代和老年代)
  • -Xmx 最大对内存(包括新生代和老年代)
  • 通常建议将 -Xms 与 -Xmx 设置为大小相等,即不需要保留内存,不需要从小到大增长,这样性能较好
  • -XX:NewSize 与 -XX:MaxNewSize 设置新生代的最小与最大值,但一般不建议设置,由 JVM 自己控制
  • -Xmn 设置新生代大小,相当于同时设置了 -XX:NewSize 与 -XX:MaxNewSize 并且取值相等
  • 保留是指,一开始不会占用那么多内存,随着使用内存越来越多,会逐步使用这部分保留内存。下同

堆内存,按比例设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKEZzyDX-1657505229660)(img/image-20210831173045700.png)]

解释:

  • -XX:NewRatio=2:1 表示老年代占两份,新生代占一份
  • -XX:SurvivorRatio=4:1 表示新生代分成六份,伊甸园占四份,from 和 to 各占一份

元空间内存设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XvW60opx-1657505229661)(img/image-20210831173118634.png)]

解释:

  • class space 存储类的基本信息,最大值受 -XX:CompressedClassSpaceSize 控制
  • non-class space 存储除类的基本信息以外的其它信息(如方法字节码、注解等)
  • class space 和 non-class space 总大小受 -XX:MaxMetaspaceSize 控制

注意:

  • 这里 -XX:CompressedClassSpaceSize 这段空间还与是否开启了指针压缩有关,这里暂不深入展开,可以简单认为指针压缩默认开启

代码缓存内存设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hU6iTEuR-1657505229661)(img/image-20210831173148816.png)]

解释࿱

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
黑马Java面试八股文是指在Java开发岗位面试中常被问到的一些基础知识点和常见问题。这些问题涵盖了Java语言的核心概念、面向对象编程、集合框架、多线程、IO流、数据库等方面。回答这些问题可以帮助面试者展示自己的Java基础知识和编程能力。 以下是一些常见的黑马Java面试八股文问题及其答案: 1. Java语言的特点有哪些? - 简单易学 - 面向对象 - 平台无关性 - 安全性 - 高性能 2. 什么是面向对象编程? 面向对象编程是一种编程范式,它将数据和操作数据的方法封装在一起,通过创建对象来实现对数据的操作和管理。 3. Java中的四种访问权限修饰符是什么? - public:公共访问权限,可以被任何类访问。 - protected:受保护访问权限,可以被同一包内的类和子类访问。 - default:默认访问权限,可以被同一包内的类访问。 - private:私有访问权限,只能被本类访问。 4. 什么是多态性? 多态性是指同一操作作用于不同的对象,可以有不同的解释和不同的执行结果。它通过父类或接口的引用指向子类的对象实现。 5. 什么是Java中的抽象类和接口? - 抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。子类继承抽象类时,必须实现抽象方法。 - 接口是一种完全抽象的类,它只包含常量和抽象方法。类可以实现多个接口,实现接口的类必须实现接口中定义的所有方法。 6. 什么是Java中的异常处理机制? 异常处理机制是一种用于处理程序运行过程中出现的异常情况的机制。Java中的异常分为可检查异常和不可检查异常,通过try-catch-finally语句块来捕获和处理异常。 7. 什么是Java中的线程?如何创建线程? 线程是程序执行的最小单位,它可以独立运行并与其他线程并发执行。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。 8. 什么是Java中的集合框架?常用的集合类有哪些? 集合框架是Java提供的一组用于存储和操作数据的类和接口。常用的集合类有ArrayList、LinkedList、HashSet、HashMap等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱Coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值