JVM入门篇(面试前速补)

近期看看JVM,看了狂神说入门教学,总结下给大家。

文章目录

  • 1、JVM的位置
  • 2、JVM的结构体系
  • 3、类加载器及双亲委派机制
    • 3.1、类加载器作用
    • 3.2、类加载器类型
    • 3.3、双亲委派机制 *
  • 4、沙箱安全机制
  • 5、Native、方法区
    • 5.1、Native(本地方法栈引用) *
    • 5.2、PC寄存器
    • 5.3、方法区 *
  • 6、栈
  • 7、走近HotSpot和堆
    • 设置VM参数
  • 8、使用JPofiler工具分析OOM原因
  • 9、GC算法 *
    • 9.1、引用计数法
    • 9.2、复制算法
    • 9.3、标记压缩清除法
  • 总结
  • 面试点

1、JVM的位置

JVM处于操作系统之上,为Java程序在不同的系统平台上的运行提供便利,与硬件没有直接的交互。

2、JVM的结构体系

引用地址存在栈内,实际指向的内容存在堆中。

3、类加载器及双亲委派机制

3.1、类加载器作用

3.2、类加载器类型

  • 虚拟机自带的加载器

  • 启动器(根)加载器

  • 扩展类加载器

  • 应用程序加载器

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3、双亲委派机制 *

类加载器负责加载类的字节码并创建对应的Class对象。双亲委派机制是指当一个类加载器收到类加载请求时,它会先将该请求委派给它的父类加载器去尝试加载。只有当父类加载器无法加载该类时,子类加载器才会尝试加载。

优点:避免重复加载:通过委派给父类加载器,可以避免同一个类被多次加载,提高了加载效率。安全性:通过双亲委派机制,核心类库由根加载器加载,可以确保核心类库的安全性,防止恶意代码替换核心类。扩展性:开发人员可以自定义类加载器,实现特定的加载策略,从而扩展Java的类加载机制。缺点:灵活性受限:双亲委派机制对于某些特殊的类加载需求可能过于严格,限制了加载器的灵活性。破坏隔离性:如果自定义类加载器不遵循双亲委派机制,可能会破坏类加载的隔离性,导致类冲突或安全性问题。不适合动态更新:由于类加载器在加载类时会先检查父加载器是否已加载,因此在动态更新类时可能会出现问题,需要额外
的处理。

4、沙箱安全机制


5、Native、方法区

5.1、Native(本地方法栈引用) *

5.2、PC寄存器

5.3、方法区 *

static、final、Class模板、常量池

从Java 8开始,常量池从方法区转移到Java虚拟机堆内存之中

6、栈

栈:先进后出

队列:先进先出(FIFO:First Input First Output)

堆、栈、方法区:(从Java 8开始,常量池从方法区转移到Java虚拟机内存之中)

7、走近HotSpot和堆

Heap,一个JVM只有一个堆内存,堆内存的大小是可以调整的。

类加载器读取了类文件后,一般会把什么东西放到堆中呢?

类、方法、常量、变量~,保存我们所有引用类型的真实对象(实例对象)

堆内存中细分为三个区域:

  • 新生区(伊甸园区) Young/New

  • 养老区 old

  • 永久区 Perm

JDK8以后,永久存储区改名为元空间逻辑上存在(构思存在),物理上不存在

GC垃圾回收,主要是在伊甸园区和养老区~

假设内存满了,OOM,堆内存不够!

设置VM参数

public static void main(String[] args) {// 获取虚拟机试图使用最大内存long max = Runtime.getRuntime().maxMemory();// 获取Jvm内存long total = Runtime.getRuntime().totalMemory();System.out.println("max memory :" + max+" 字节,"+max/(double)1024/1024+"MB");System.out.println("total memory :" + total+" 字节,"+total/(double)1024/1024+"MB");
}
修改前:
max memory :3309305856 字节,3156.0MB
total memory :223346688 字节,213.0MB修改后:(添加VM配置 -Xms1024m -Xmx1024m -XX:+PrintGCDetails)
max memory :1029177344 字节,981.5MB
total memory :1029177344 字节,981.5MB
HeapPSYoungGen      total 305664K, used 15729K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000)eden space 262144K, 6% used [0x00000000eab00000,0x00000000eba5c420,0x00000000fab00000)from space 43520K, 0% used [0x00000000fd580000,0x00000000fd580000,0x0000000100000000)to   space 43520K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000fd580000)ParOldGen       total 699392K, used 0K [0x00000000c0000000, 0x00000000eab00000, 0x00000000eab00000)object space 699392K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000eab00000)Metaspace       used 3432K, capacity 4496K, committed 4864K, reserved 1056768Kclass space    used 370K, capacity 388K, committed 512K, reserved 1048576K

8、使用JPofiler工具分析OOM原因

下载JPofiler工具,安装idea的JPofiler插件

//-Xms 设置初始化内存分配大小
//-Xmx 设置最大分配内存
//-XX:+PrintGCDetails  打印GC垃圾回收信息
//-XX:+HeapDumpOnOutOfMemoryError  OOM时拿到内存快照文件
public class OOMTest {public static void main(String[] args) {ArrayList<OOMTest> list = new ArrayList<>();int count = 0;// 创建数组,一直扩大while (true) {list.add(new OOMTest());count ++;}}
}

VM参数加入 -Xms1m -Xmx2m -XX:+HeapDumpOnOutOfMemoryError (OOM时拿到内存快照文件)

运行后在项目根目录能拿到内存快照文件,打开后可以看线程转储这部分分析

由此可得出具体报错位置

9、GC算法 *

9.1、引用计数法

9.2、复制算法

  • 好处:没有内存碎片
  • 坏处:浪费空间,多了一半内存空间永远是空to
  • 使用场景:对象存活率较低的情况下(新生区)

9.3、标记压缩清除法

标记清除法

优点:不需要额外的空间

缺点:两次扫描,严重浪费时间,会产生内存碎片

优化:增加压缩(标记压缩算法)

总结

内存效率:复制算法>标记清除>标记压缩(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法

没有最优算法。只有最合适的算法。

所以GC的好处:分代收集算法
年轻代:存活率低,用复制算法
老年代:存活率高,区域大,用标记清除+标记压缩混合实现(标记清除n次,进行标记压缩)

面试点

JVM的内存模型和分区~详细到每个区放什么?

JVM 分为堆区和栈区,还有方法区

堆区 存对象实例、数组、常量池(从Java 8开始,常量池从方法区转移到Java虚拟机堆内存之中)等

栈区 存引用地址,八大基础数据类型(局部变量),实例方法

方法区 存 static、final、Class模板

堆里面的分区有哪些?Eden,form,to,老年区,说说他们的特点?

堆分为年轻代(伊甸园区,幸存区0和1)和老年代两个分区(元空间是逻辑上存在)

Eden区(伊甸园区)是年轻代中最大的一个区域,用于存放新创建的对象。当一个对象被创建时,首先会被分配到Eden区。当满员触发GC存活对象会放置幸存区;

Survivor区是年轻代中的两个区域之一,一般称为From区和To区。伊甸园区GC存活的的会转至幸存区的From区,下次GC时若存活则复制至To区(谁空或谁少为to区)

老年区是年轻代中对象经过多次轻GC仍然存活的对象所存放的区域,老年区的对象生命周期较长,因此老年区的垃圾回收频率较低,当需要GC是重GC(Full
GC),会对整个堆内存进行回收。

GC的算法有哪些?标记清除法,标记压缩,复制算法,引用计数法,怎么用?

GC(分代收集法)的算法(GC的作用域是堆和方法区):标记清除法、标记压缩法、复制算法、引用计数法

引用计数法:各个对象每用一次,该对象计数器就+1(计数器本身也要有消耗)。当计数器为0时,说明该对象没有,就立刻进行垃圾回收。

复制算法:(年轻代主要用到复制算法:Eden区和幸存者区,要知道幸存区分为from和to两个区域:哪一个区域是空哪一个区域就是to区。)

标记清除:先扫描对象,对活着的对象进行标记。然后开始清除,对没有标记的对象进行清除

标记压缩:在标记清除的基础上再次扫描,向一端移动所有存活的对象(减少了内存碎片)

轻GC和重GC分别在什么时候发生?

法、引用计数法**

引用计数法:各个对象每用一次,该对象计数器就+1(计数器本身也要有消耗)。当计数器为0时,说明该对象没有,就立刻进行垃圾回收。

复制算法:(年轻代主要用到复制算法:Eden区和幸存者区,要知道幸存区分为from和to两个区域:哪一个区域是空哪一个区域就是to区。)

标记清除:先扫描对象,对活着的对象进行标记。然后开始清除,对没有标记的对象进行清除

标记压缩:在标记清除的基础上再次扫描,向一端移动所有存活的对象(减少了内存碎片)

轻GC和重GC分别在什么时候发生?

轻GC一般发生在 新生代和幸存区,重GC一般发生在老年代

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SQL】1068. 产品销售分析 I

题目描述 leetcode题目&#xff1a;1068. 产品销售分析 I 写法 select Product.product_name, Sales.year, Sales.price from Sales left join Product on Sales.product_id Product.product_id记录细节&#xff1a;加上表名检索效率更高。 -- ERROR: 时间超出限制 > 加…

181基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2

基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2&#xff1b;预测信号由二阶线性预测模型产生。2.利用LMS算法和RLS算法将一个叠加有噪声的信号实现噪声消除&#xff0c;恢复原始信号。有22页试验分析文档。&#xff08;包括程序在内&…

华为OD机试 - 疫情扩散时间计算 - 矩阵(Java 2024 C卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&am…

解决 Python 脚本无法生成结果的问题

我们在python编程时&#xff0c;始终无法生成想要的成果&#xff0c;其实问题并非单一的&#xff0c;可能有多种情况导致的结果&#xff1b;例如&#xff1a;语法错误、运行时错误、依赖项问题、权限问题、死锁或阻塞等问题&#xff0c;下面我将举例说明遇到这些问题该如何解决…

Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…

Java多线程——对象的原子更新

目录 引出对象原子更新AtomicReferenceAtomicLongFieldUpdaterABA问题 Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——对象的原子更新 对象原子更新 AtomicReference package cn.test3; import lombok.AllAr…

springboot之mybaitsPlus

mybaitsPlus是国内开发的&#xff0c;并不是springboot的项目&#xff0c;只是学习的时候直接就是适配的springboot。 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不…

linuxOPS基础_操作系统概述

计算机发展史 第一台计算机是1946 年2 月14 日诞生日&#xff0c;第一台名称ENIAC。体积一间屋子的大小&#xff0c;重量高达28t。 第一代&#xff1a;1946 – 1958 > 12 年 &#xff08;电子管&#xff09; 第二代&#xff1a;1958 – 1964 > 6 年 &#xff08;晶体管…

vue实现虚拟键盘

本文介绍一体机常用的虚拟键盘实现&#xff0c;主打一个免费文章。喜欢就点个赞支持一下吧 simple-keyboard官网&#xff1a;simple-keyboard - simple-keyboard - Francisco HodgeSimple-keyboard is a virtual keyboard for Javascript. You can use it as an input for dev…

请你简单说一下 Mysql 的事务隔离级别

什么情况&#xff0c;写了 5 年的 CRUD&#xff0c;还搞不清楚 Mysql 的事务隔离级别&#xff0c;难怪第一面就被刷下来。 一个 5 年经验的粉丝&#xff0c;在一个公司干了 5 年&#xff0c;觉得自己特厉害&#xff0c;什么都能搞定&#xff0c;结果每次一到技术面就被刷。问我…

【项目】图书管理系统

目录 前言&#xff1a; 项目要求&#xff1a; 知识储备&#xff1a; 代码实现&#xff1a; Main&#xff1a; Books包&#xff1a; Book&#xff1a; BookList&#xff1a; Operate包&#xff1a; Operate: addOperate: deleteOperate: exitOperate: findOperate:…

Redis(十七)分布式锁

文章目录 面试题分布式锁锁的种类分布式锁需要具备的条件和刚需分布式锁 案例nginx分布式微服务部署&#xff0c;单机锁问题分布式锁注意事项lock/unlocklua脚本自研版的redis分布式锁搞定lua脚本 可重入锁可重入锁种类可重入锁hset实现&#xff0c;对比setnx&#xff08;重要&…

16-Java命令模式 ( Command Pattern )

Java命令模式 摘要实现范例 命令模式&#xff08;Command Pattern&#xff09;中请求以命令的形式包裹在对象中&#xff0c;并传给调用对象 调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对象执行命令 命令模式是行为型模式&…

Clion调试QT程序qDebug()、cout控制台无输出的可能解决方法

qDebug()不输出 在当前项目配置中添加一个环境变量 方法一、单独为配置 QT_ASSUME_STDERR_HAS_CONSOLE1 方法二、全局配置&#xff08;系统变量&#xff09; 一劳永逸 效果 cout不输出 Clion在debug调试C/C的时候&#xff0c;printf/cout不会实时输出情况 结果同上~ 谢阅…

SDM450核心板_高通SDM450安卓核心板模块性能参数

高通SDM450核心板是基于SDM450移动平台开发的一款高性能核心板。采用领先的14纳米技术&#xff0c;该核心板为高端智能设备提供了卓越的性能和优质的体验。板载2GB16GB的内存(可选配4GB32GB)&#xff0c;双 ISP(图像传感器处理器)支持丰富的照片细节和双摄像头体验&#xff0c;…

借助 Terraform 功能协调部署 CI/CD 流水线-Part 1

在当今快节奏的开发环境中&#xff0c;实现无缝、稳健的 CI/CD 流水线对于交付高质量软件至关重要。在本文中&#xff0c;我们将向您介绍使用 Bitbucket Pipeline、ArgoCD GitOps 和 AWS EKS 设置部署的步骤&#xff0c;所有步骤都将利用 Terraform 的强大功能进行编排。在Part…

01_Maven

文章目录 Maven安装MavenMaven的工作流程配置MavenMaven的使用module和project的关系如何用Maven导包 如何用Maven进行项目构建指令介绍clean指令compile指令package指令install指令 Maven的依赖管理如何导包scope作用域依赖传递依赖冲突 使用Maven开发项目Junit如何使用Junit …

力扣刷题Day11--21. 合并两个有序链表(js)

目录 1&#xff0c;题目 2&#xff0c;代码 2.1迭代思想 2.2递归思想 3&#xff0c;学习与总结 3.1js中的链表类 3.2递归思想 3.3提醒自己 1&#xff0c;题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2&am…

YOLOv9独家原创改进|加入RT-DETR中的HGBlock!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 HGBlock是RT-DETR中使用的特征提取模块。 二、HGBlock模块详解 2.1 模块简介 HGBlock的主要思想&#xff1a; 一个并联的卷积模块与…

java上传本地文件到服务器共享

在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…