JVM入门篇(面试前速补)

news2024/11/25 20:49:31

近期看看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
Heap
 PSYoungGen      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 1056768K
  class 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.coloradmin.cn/o/1493243.html

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

相关文章

算法设计.

文章目录 1. 贪心算法&#xff1a;只看当前1.1 零钱兑换问题&#xff1a;力扣322 2. 活动选择问题3. 动态规划3.1 不同路径&#xff1a;3.2 0-1背包问题3.3 完全背包问题3.4 零钱兑换-动态规划 4. 最长公共字串--动态规划5. 最长公共子序列6. 最长递增子序列7. 打家劫舍8. 全排…

从mysql 数据库表导入数据到elasticSearch的几种方式

从MySQL数据库导入数据到Elasticsearch有几种方式&#xff0c;主要包括以下几种&#xff1a; 1. 使用Logstash&#xff1a; Logstash是一个开源的数据收集引擎&#xff0c;可以用来从不同的数据源导入数据到Elasticsearch。它具有强大的数据处理能力和插件生态系统&…

信息熵、KL散度、交叉熵、互信息、点互信息

信息熵 信息量 信息量是对信息的度量&#xff0c;衡量事件的不确定性&#xff0c;越小概率的事件发生了产生的信息量越大。我们应该用什么形式的函数表达信息量呢&#xff1f;除了随着概率增大而减少&#xff0c;这个函数还有具有以下性质&#xff1a; 如果有两个事件x和y彼…

利用Python爬取高德地图全国地铁站点信息

利用Python中的requests库进行地铁站点信息的获取,同时将数据保存在本机excel中 # 首先引入所需要的包 import requests from bs4 import BeautifulSoup import pandas as pd import json# 发送 GET 请求获取网页内容 url http://map.amap.com/subway/index.html response r…

K线实战分析系列之二十三:塔形顶部和塔形底部

K线实战分析系列之二十三&#xff1a;塔形顶部和塔形底部 一、塔形顶部和塔形底部二、塔形顶部和塔形底部总结 一、塔形顶部和塔形底部 塔形顶部&#xff1a;预示着阶段性顶部的形成 塔型底部&#xff1a;预示着阶段性底部的形成 二、塔形顶部和塔形底部总结 形态的两…

字节后端实习 一面凉经

心脏和字节永远都在跳动 深圳还有没有大厂招后端日常实习生啊&#xff0c;求捞&#xff5e;&#xff08;boss小公司也不理我&#xff09; 很纠结要不要干脆直接面暑期实习&#xff0c;又怕因为没有后端实习经历&#xff0c;面不到大厂实习。死锁了

2195. 深海机器人问题(网络流,费用流,上下界可行流,网格图模型)

活动 - AcWing 深海资源考察探险队的潜艇将到达深海的海底进行科学考察。 潜艇内有多个深海机器人。 潜艇到达深海海底后&#xff0c;深海机器人将离开潜艇向预定目标移动。 深海机器人在移动中还必须沿途采集海底生物标本。 沿途生物标本由最先遇到它的深海机器人完成采…

微信公众号公司主体变更怎么办?

公众号迁移的好处有哪些&#xff1f;迁移后原公众号还能用吗&#xff1f;1&#xff09;获得更多权限功能如果公众号是个人主体&#xff0c;想进行认证&#xff0c;拥有更多权限功能。例如菜单栏跳转外部链接&#xff0c;相拥有留言功能&#xff0c;服务号认证获得开发权限等。就…

@德人合科技|公司数据防泄漏软件,防止内部文件数据资料外泄!

现如今&#xff0c;企业都普遍面临数据安全问题的挑战&#xff0c;随着数据泄漏事件不断增加&#xff0c;企业需要强有力的数据防泄漏系统来保护机密信息。 www.drhchina.com 德人合科技 | 公司数据防泄漏软件&#xff0c;防止内部文件数据资料外泄&#xff01; 公司数据防泄漏…

基于springboot的精品在线试题库系统设计与实现(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 目录 一、研…

微软研究深度报告:Sora文转视频AI模型全景剖析及未来展望

论文由微软研究团队撰写&#xff0c;这篇论文深入探讨了Sora的发展背景、核心技术、新兴应用场景、现有的局限性以及未来的发展机会&#xff0c;基于公开资料和团队自行进行的逆向工程分析。文中详尽且逻辑清晰&#xff0c;建议细读全文以获得深入了解。 原文&#xff1a;Sora…

优思学院《质量工程师入门攻略2024》

作为一名质量工程师&#xff0c;进入这个行业首先需要理解“质量”的本质含义。质量并非单一维度&#xff0c;而是产品或服务在满足预期程度上的体现。从狭义到广义的质量&#xff0c;涵盖从产品细节到客户满意度的多个方面。 1. 质量的定义是以顾客需求为准 第一&#xff0c…

高级语言讲义2018计专(仅高级语言部分)

1.编写完整程序解决中国古代数学家张丘健在他的《算经》中提出的”百钱百鸡问题“&#xff1a;鸡翁一&#xff0c;值钱五&#xff1b;鸡母一&#xff0c;值钱三&#xff1b;鸡雏三&#xff0c;值钱一&#xff1b;百钱买百鸡&#xff0c;翁&#xff0c;母&#xff0c;雏各几何 …

每日一题-链表的中间结点

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 上面是解题题目&#xff1a; 解题思路&#xff1a;快慢指针法--慢指针一次指向下一个&#xff0c;快指针一次指向下两个 解答过程&#xff1a; /*** Definition for singly-linked…

shopify 如何实现阶梯价展示

在Shopify中&#xff0c;您可以通过使用变体&#xff08;variants&#xff09;和价格规则&#xff08;price rules&#xff09;来实现阶梯价展示。阶梯价是指随着购买数量的增加&#xff0c;商品价格逐渐降低的策略。以下是在Shopify上实现阶梯价展示的步骤&#xff1a; 1. 创…

全志D1s开发板软件入门之Hello World演示

Hello Word 本章节将讲解如何使用电脑&#xff08;上位机&#xff09;交叉编译一个打印 hello word 的小应用&#xff0c;并将其push到开发板&#xff08;下位机&#xff09;上运行起来&#xff0c;打印出 hello word。这是嵌入式应用开发的最基础步骤。在此之前&#xff0c;你…

JavaScript的for循环与双重for循环,聪明人已经收藏了

css盒模型 1&#xff0c;css盒模型基本概念&#xff1f; 2&#xff0c;标准模型和IE模型的区别&#xff1a;计算高度和宽度的不同&#xff0c;怎么不同&#xff0c;高度宽度是怎么计算的&#xff1f; 3&#xff0c;css如何设置这两种模型&#xff1f; 4&#xff0c;js如何设置…

【BUG】Windows状态栏总卡死解决办法

屋漏偏逢连夜雨&#xff0c;正在赶deadline呢&#xff0c;Windows状态老卡死&#xff0c;一时间崩溃。 解决办法&#xff1a; 右键状态栏新闻和咨询关掉 这个烧笔新闻与资讯我真服了

做分析用什么工具

做分析用什么工具 导读 数据分析是数据辅助决策的最后一公里&#xff0c;是最终的数据可视化展示与探索分析的部分&#xff0c;选择使用最适合的数据展示方式&#xff0c;可以帮助分析人员大大提升分析效率。 问题&#xff1a; ● 纠结选择哪个工具 ● 纠结从哪里学起&#x…

Java 学习和实践笔记(27):Object类的基本特性、toString方法以及IDEA的部分快捷键介绍

Object类基本特性&#xff1a; 1.Object类是所有类的父类&#xff0c;所有的Java对象都拥有Object类的属性和方法&#xff08;注意拥有并不等于可以直接使用&#xff09; 2.如果在类的声明中未使用extends&#xff0c;则默认继承Object类。 toString方法是Object类里定义的一个…