JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。

像字节、阿里、腾讯、美团、京东等大厂面试,JVM调优必问必答必会的问题,重要性不言而喻。


上篇文章详细分析了类加载器类型、双亲委派机制优缺点、以及如何打破双亲委派机制。末尾我们留了一个问题:类加载到内存过程具体会经过那些流程?

1、加载验证:类加载器加载二进制.class文件到内存后,开始验证.class文件是否符合JVM规范,检查格式、语义等是否符合规正确。比如.class文件生成后,被别人直接随便修改编辑,这就会被发现不规范不安全。

2、准备:验证之后,开始给.class的进行分配内存空间(今天重点讲如何分配内存),以及给一个初始默认值。比如加载了这个Demo001ClassLoader类,在准备阶段就需要给Demo001ClassLoader分配内存(放在哪?看完本文就知道),以及要给里面的paramA变量分配内存,并给它赋一个默认0值。

public class Demo001ClassLoader {
    private static int paramA = getParamA();
    private static List<String> strList = new ArrayList<>();
    static {
        strList.add("a");
    }
    public static int getParamA() {
        User user = new User("aa");
        return user.getAge();
    }
}

3、解析:我们代码开发,引用方法、变量,都是通过方法名、变量名去引用。这种是符号引用。在解析阶段,会把符合引用解析成直接引用,这样jvm就可以直接执行 。

4、初始化:这个很重要。在阶段2【准备】,仅仅是给paramA分配空间并赋默认值,初始化就是赋予具体值。这时候初始化,就是开始调用getParamA()方法,发现还有加载User类,然后获取对应值,赋值给paramA变量。以及执行static修饰的代码块。

image.png

一、元数据区MetaSpace

   这个区,主要放类加载器加载进来的.class文件。在JDK8以前,这个也叫方法区。这个元数据区不占用堆内存,这个区是直接使用系统内存。

二、程序计数器(多线程之间独自占有)

    .class文件也是经过编译后的一行行代码指令,每个线程执行代码指令时候,通过程序计数器,记录当前执行字节码指令位置。

三、虚拟机栈(多线程之间独自占有)

   每个线程都有自己的一个虚拟机栈,当访问一个方法时,就给这个方法创建一个栈帧。用来存放方法里的局部变量、方法出口、动态链接等,主要用来存放方法里的局部变量。比如线程执行了ABC 三个方法,A()->B(),B 方法里有个局部变量b->C()。分别创建了ABC栈帧入栈,执行完C方法后,C帧出栈,然后B方法帧的局部变量b出栈,然后B方法帧出栈,最后A方法帧从虚拟机栈出栈。

    以及方法里又调用其他方法,这时候将方法的符号引用,变成直接引用==也叫做动态链接。

四、堆内存-核心的核心(多线程共享读写堆空间数据)

     堆内存就是存放类对象实例,GC回收就是在这个区域进行。在三的虚拟机栈,如果栈里有局部变量,属于八大基本类型数据int、double之类,直接存值,如果是实例对象,局部变量只是存地址引用。局部变量对象的数据就会存在堆内存中。

    在堆内存里,年轻代Young和老年代Old。年轻代分Eden区、S1区、S2区共三个区。默认各自占年轻代的8:1:1空间。

新对象都尝试存放在年轻代的Eden区,如果Eden区放不下,就触发YGC。

五、本地方法栈

    和虚拟机栈有点类似,用来执行native方法,但不是native方法都不是java实现,主要是C++实现。native方法可以直接访问操作系统API、硬件设备,本地方法栈为这些方法的执行提供了环境。

image.png

据此,阅读了系列1和本文,可以轻松回答JVM的类加载器种类作用、双亲委派机制以及其优缺点,还有如何打破双亲委派机制。还有类加载过程做了什么,以及执行main方法后,main线程的虚拟机栈如何对方法栈帧入栈出栈,以及局部变量,.class文件,类变量,实例对象存储,都一清二楚。

今天分享到这,留一个问题,堆对象的生命周期是咋样的呢?什么时候被回收,回收前又如何流转?具体又是被如何回收?

相关文章
|
6天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
6天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
8天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
29 6
|
4天前
|
Java Linux Windows
JVM内存
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制。
7 1
|
1月前
|
Arthas Kubernetes Java
字节面试:CPU被打满了,CPU100%,如何处理?
尼恩,一位拥有20多年经验的老架构师,针对近期读者在一线互联网企业面试中遇到的CPU 100%和红包架构等问题,进行了系统化梳理。文章详细解析了CPU 100%的三大类型问题(业务类、并发类、内存类)及其九种常见场景,提供了使用jstack和arthas两大工具定位问题的具体步骤,并分享了解决死锁问题的实战案例。尼恩还强调了面试时应先考虑回滚版本,再使用工具定位问题的重要性。此外,尼恩提供了丰富的技术资料,如《尼恩Java面试宝典》等,帮助读者提升技术水平,轻松应对面试挑战。
字节面试:CPU被打满了,CPU100%,如何处理?
|
1月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
23天前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
45 10
|
22天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
28天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
67 1
|
1月前
|
存储 Kubernetes 架构师
阿里面试:JVM 锁内存 是怎么变化的? JVM 锁的膨胀过程 ?
尼恩,一位经验丰富的40岁老架构师,通过其读者交流群分享了一系列关于JVM锁的深度解析,包括偏向锁、轻量级锁、自旋锁和重量级锁的概念、内存结构变化及锁膨胀流程。这些内容不仅帮助群内的小伙伴们顺利通过了多家一线互联网企业的面试,还整理成了《尼恩Java面试宝典》等技术资料,助力更多开发者提升技术水平,实现职业逆袭。尼恩强调,掌握这些核心知识点不仅能提高面试成功率,还能在实际工作中更好地应对高并发场景下的性能优化问题。