如何学习JVM的知识

文章目录

    • [1. 明确学习JVM知识的目的](#1. 明确学习JVM知识的目的)
    • [2. 高屋建瓴地审视知识点](#2. 高屋建瓴地审视知识点)

1. 明确学习JVM知识的目的

为什么需要学习jvm的知识?

jvm的知识重点是内存分配和垃圾回收,这些都是能更深入理解java代码运行原理的关键,也是求职面试中绕不过去的一个坎。

并且它还涉及到并发编程的一些知识点。所以,说jvm是重点一点也不为过。

2. 高屋建瓴地审视知识点

那么如何从高屋建瓴的角度对jvm的知识进行说明呢?

对此可将其分为几个部分进行理解。这就需要我们对知识打散再重组,使其更加具有逻辑性。

首先,我们需要知道jvm的大概组成:类加载器、运行时数据区域、执行引擎、本地方法库。

如果从代码执行的先后次序:我们可能需要按类加载器、运行时数据区域、执行引擎这个顺序进行知识的组织。

但是,如果要将类加载器讲明白,则首先需要解释清楚什么是类文件,它的结构是怎样的。但是,这部分的内容真心不是那么的重要。至少和其他内容比,它不是那么地重要。

所以从开发人员的角度,和我们平时工作最密切的还是内存的那一部分。

那么关于内存,我们需要按怎样的顺序去进行学习呢?当然还是先按自顶而下的顺序整理。

首先,要清楚jvm在运行时的数据区域有哪些?并且要知道在jdk1.8之前和之后是有一些变化的。

其中最重要也是接触最多的是:堆、栈和方法区。

其中的堆主要是用于存放对象实例的。在oop中对象绝对是一个核心概念,所以堆的重要性就不言而喻了。

那么围绕堆和对象的知识点就来了:

  1. 对象的创建过程是怎样的
  2. 对象在内存中的结构是怎样的(专业的叫法:对象的内存布局)
  3. 对象在内存分配时使用的哪种方式(有的地方也称为:分配算法)
  4. 知道什么是"指针碰撞"吗?
  5. 知道什么是"空闲列表"吗?
  6. 内存分配算法是否存在并发问题?是如何解决并发问题的?
  7. 请说一说"TLAB"
  8. 对象创建好后,如何对其进行定位访问
  9. jvm中堆的结构是怎样的?新生代、老年代。
  10. 什么是空间分配担保?
  11. JVM中老年代和新生代的比例是多少?

刚才讲了对象的创建以及内存的分配,如果对象不再需要了,那么是不是会涉及到内存的回收?

jvm中的内存宣称是自动管理的。虽然我们不需要主动对其进行释放,但是其中的垃圾收集原理是必须掌握的。

因为万一内存没有按照既定的样子进行回收,我们需要知道具体的原因,否则只有两眼一抹黑了。

那么,和内存回收的知识有哪些呢?

  1. 说一说常见的内存回收算法
  2. 如果判断一个对象是否需要回收,有哪些方法
  3. 你知道哪些垃圾收集器?请简要说一说它们
  4. 什么情况下会发生Minor GC/YGC?
  5. 什么场景下会发生Full GC?
  6. 哪些场景会导致OOM?
  7. 哪些场景会导致SOF?
  8. 知道什么是GC Roots吗?哪些类可以作为GC Roots?
  9. 当对象不可达时,jvm会立即回收这个对象吗?
  10. 垃圾收集器的比较。(从串并行、作用位置,回收算法,特点,适用场景说明)【★】

在oo的世界里,一切皆对象。如果需要一个对象执行某个动作,就需要通过调用方法的方式来传递消息。

说到方法的调用,就需要了解方法栈。Java方法的调用过程中会创建栈帧。虽然我们常说对象都是在堆中存储的,但是当某些情况下,会将方法内创建的对象存储在栈中,这种情况有个专门的术语叫"栈上分配"。

关于栈,我们需要了解下面的知识:

  1. 说一说什么是java虚拟机栈?
  2. 说说局部变量表
  3. 说说方法区
  4. 请讲一下什么是运行时常量池?
  5. 什么是"全局字符串池"
  6. 了解过"class文件常量池"吗?
  7. 上述的三个常量池之间是什么关系?
  8. 请讲一下运行时栈帧的结构
相关推荐
Lojarro13 分钟前
【Spring】Spring框架之-AOP
java·mysql·spring
莫名其妙小饼干15 分钟前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
isolusion27 分钟前
Springboot的创建方式
java·spring boot·后端
zjw_rp1 小时前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob1 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
TodoCoder1 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行1 小时前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾2 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富2 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua