面试笔记——JVM组成

news2024/11/28 9:37:01

基本介绍

JVM: Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境)

使用JVM的好处:

  • 一次编写,到处运行
  • 自动内存管理,垃圾回收机制

在这里插入图片描述
JVM的组成及运行流程:
在这里插入图片描述

程序计数器

程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址
javap -v xx.class —— 打印堆栈大小,局部变量的数量和方法的参数。

Java堆

Java堆是线程共享的区域,主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

Java8的内存结构:
在这里插入图片描述

Java7的内存结构:
在这里插入图片描述
元空间保存的类信息、静态变量、常量、编译后的代码。在Java8之后,把堆的方法区/永久代(主要存放类、常量信息)放在了本地内存中,用元空间替代。这样做,可以避免随着动态类加载的情况越来越多导致的OOM。
总结,Jdk1.7和1.8的区别:

  • 1.7中有有一个永久代,存储的是类信息、静态变量、常量、编译后的代码。
  • 1.8移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出。

堆空间:

  • 年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到老年代区间。
  • 老年代主要保存生命周期长的对象,一般是一些老的对象。

虚拟机栈

Java Virtual machine Stacks (java 虚拟机栈)

  • 每个线程运行时所需要的内存,称为虚拟机栈,先进后出
  • 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

相关问题一:垃圾回收是否涉及栈内存?
答:垃圾回收主要指的是对内存,当栈帧弹栈之后,栈内存就会自动释放,因此垃圾回收不涉及栈内存。

相关问题二:栈内存分配越大越好吗?
答:未必,默认的栈内存通常为1024k。栈帧过大会导致线程数变少,例如,机器总内存为512m,目前能活动的线程数则为512个,如果把栈内存改为2048k,那么能活动的栈帧就会减半。

相关问题三:方法内的局部变量是否线程安全?
答:如果方法内局部变量没有逃离方法的作用范围,它是线程安全的;如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全,如图:
在这里插入图片描述
栈内存溢出——java.lang.StackOverflowError:

  • 情况一:栈帧过多导致栈内存溢出,典型问题——递归调用
  • 情况二:栈帧过大导致栈内存溢出

堆栈的区别:

  • 栈内存一般会用来存储局部变量和方法调用,但堆内存是用来存储Java对象和数组的的。堆会GC垃圾回收,而栈不会。
  • 栈内存是线程私有的,而堆内存是线程共有的。
  • 两者异常错误不同,但如果栈内存或者堆内存不足都会抛出异常。
    • 栈空间不足:java.lang.StackOverFlowError。
    • 堆空间不足:java.lang.OutOfMemoryError。

方法区

方法区(Method Area)是各个线程共享的内存区域,主要存储类的信息、运行时常量池,虚拟机启动的时候创建,关闭虚拟机时释放,如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError: Metaspace。

方法区的存储方式:
在这里插入图片描述
常量池: 可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等信息。
查看字节码结构(类的基本信息、常量池、方法定义):javap -v xxxx.class
demo:

import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;

/**
 * 演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace
 * -XX:MaxMetaspaceSize=8m
 */
public class MetaspaceDemo extends ClassLoader { // 可以用来加载类的二进制字节码
    public static void main(String[] args) {
        MetaspaceDemo test = new MetaspaceDemo();
        for (int i = 0; i < 10000; i++) {
            // ClassWriter 作用是生成类的二进制字节码
            ClassWriter cw = new ClassWriter(0);
            // 版本号, public, 类名, 包名, 父类, 接口
            cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Class" + i, null, "java/lang/Object", null);
            // 返回 byte[]
            byte[] code = cw.toByteArray();
            // 执行了类的加载
            test.defineClass("Class" + i, code, 0, code.length); // Class 对象
        }
    }
}

设置元空间大小:
在这里插入图片描述

在这里插入图片描述
运行时常量池: 常量池是 *.class 文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址
在这里插入图片描述

直接内存

直接内存:并不属于JVM中的内存结构,不由JVM进行管理。是虚拟机的系统内存,常见于 NIO 操作时,用于数据缓冲,它分配回收成本较高,但读写性能高。

举例——使用java进行文件拷贝:
在这里插入图片描述
常规IO数据拷贝流程:
在这里插入图片描述
在进行数据的IO操作时,数据要经历两个读取操作——第一次,数据从磁盘读取到系统缓存区;第二次,才能将系统缓冲区的数据读取到java缓冲区(java代码本身访问不到系统缓存区),之后,java代码才能继续对数据进行操作。

NIO数据拷贝流程:
在这里插入图片描述
在NIO进行操作时,从系统中划分一块直接内存作为缓冲区,java代码可以直接访问这块区域的数据,相比上边的IO操作,少了一次数据复制操作。

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

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

相关文章

用Rust打印杨辉三角

一、杨辉三角是什么&#xff1f; 杨辉三角是一个著名的数学图形&#xff0c;它展示了二项式系数的排列方式。 杨辉三角是一种将二项式系数以三角形阵列排列的数学图形&#xff0c;具有丰富的历史和数学意义。 杨辉三角的历史起源可以追溯到中国南宋时期&#xff0c;由数学家杨辉…

同创优配正规炒股A股三大指数集体收涨 创指重回1900点关口

查查配5月9日电 周四,A股三大指数震荡上扬。截至收盘,上证指数涨0.83%,报3154.32点;深证成指涨1.55%,报9788.07点;创业板指涨1.87%,报1900.01点。总体上个股涨多跌少,全市场超4200只个股上涨。沪深两市今日成交额9011亿元,较上个交易日放量367亿元。 同创优配是AAA 级诚信经营…

内存卡不小心格式化了怎么办?3个方法解决数据丢失问题!

“很奇怪&#xff0c;我的内存卡不小心中病毒了&#xff0c;刚刚在清理病毒时不小心把内存卡格式化了。我保存了很多重要的数据在里面&#xff0c;还有方法可以恢复这些数据吗&#xff1f;” 在数字设备日益普及的今天&#xff0c;内存卡已成为我们存储和传输数据的重要工具。但…

竖排文字识别原理与实践操作方法

在当今数字化时代&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术已经广泛应用于各个领域&#xff0c;特别是在文档处理方面&#xff0c;OCR软件能够帮助用户快速将纸质文档转化为可编辑的电子文档。然而&#xff0c;对于竖…

OpenSearch 与 Elasticsearch:7 个主要差异及如何选择

OpenSearch 与 Elasticsearch&#xff1a;7 个主要差异及如何选择 1. 什么是 Elasticsearch&#xff1f; Elasticsearch 是一个基于 Apache Lucene 构建的开源、RESTful、分布式搜索和分析引擎。它旨在处理大量数据&#xff0c;使其成为日志和事件数据管理的流行选择。 Elasti…

顺序表的实现(迈入数据结构的大门)(2)

目录 顺序表的头插(SLPushFront) 此时&#xff1a;我们有两个思路&#xff08;数组移位&#xff09; 顺序表的头删(学会思维的变换)(SLPopFront) 顺序表的尾插(SLPushBack) 有尾插就有尾删 既然头与尾部的插入与删除都有&#xff0c;那必然少不了指定位置的插入删除 查找…

Python嵌套绘图并为条形图添加自定义标注

论文绘图时经常需要多图嵌套&#xff0c;正好最近绘图用到了&#xff0c;记录一下使用Python实现多图嵌套的过程。 首先&#xff0c;实现 Seaborn 分别绘制折线图和柱状图。 绘制折线图import seaborn as snsimport matplotlib.pyplot as pltimport warningswarnings.filterw…

【日常开发之插件篇】IDEA plugins 神器助我!!

文章目录 Tabnine 代码自动补全图例 Rainbow Brackets图例 Translation 翻译配置 LombokAlibaba Java Coding Guidelines 阿里巴巴的编码规约检查插件 今早因为老代码的一些bug让我突然觉得Idea的一些插件特别好用&#xff0c;我准备将我平时所用到的一些插件做个推荐以及记录。…

全国智能网联汽车行业产教融合共同体成立, 经纬恒润当选常务理事单位

近日&#xff0c;全国智能网联汽车行业产教融合共同体&#xff08;以下简称“共同体”&#xff09;全体成员大会在湖南株洲隆重召开。湖南省教育厅职成处副处长殷劭&#xff0c;国家智能网联汽车创新中心常务副主任、国汽&#xff08;北京&#xff09;智能网联汽车研究院有限公…

可以录屏的软件推荐3款,让你的录制更高效!

在信息时代&#xff0c;数字化学习、远程办公等场景越来越普及&#xff0c;录屏软件已经成为了人们生活中不可或缺的一部分。一款好的录屏软件可以帮助用户轻松录制屏幕内容&#xff0c;以便随时回顾或与他人分享。本文将详细介绍三款可以录屏的软件&#xff0c;帮助读者了解它…

百度百科怎么创建自己

百度百科是一个向所有互联网用户开放的平台&#xff0c;人人都可以创建词条。以下是创建自己百度百科的步骤和注意事项。 创建步骤 注册百度账号&#xff1a;首先&#xff0c;你需要注册一个百度账号。如果已经有百度账号&#xff0c;可以直接登录。 选择百科类型&#xff1a;…

FPGA+海思ARM方案,可同时接收HDMI/VGA 两种信号,远程控制

FPGA海思ARM方案&#xff0c;可同时接收HDMI/VGA 两种信号&#xff0c;通过配置输出任一图像或者拼接后的图像 客户应用&#xff1a;无线远程控制 主要特性&#xff1a; 1.支持2K以下任意分辨率格式 2.支持H264压缩图像 3.支持WIFI/4G无线传输 4.支持自适应输入图像分辨率 …

4. 分布式链路追踪客户端工具包Starter设计

前言 本文将从零搭建分布式链路追踪客户端工具包的Starter&#xff0c;并将在后续文章中逐步丰富支持的场景。这里首先将搭建一个最基础的Starter&#xff0c;能提供的功能和1. 看完这篇文章我奶奶都懂Opentracing了一文中的示例demo类似。 相关版本依赖如下。 opentracing-…

三、四线城市也能开店做真人手办定制?会不会亏?

时下&#xff0c;真人手办定制项目加盟热&#xff0c;消费端需求伴随网络效应指数心增加&#xff0c;作为真人手办定制底层技术供应商&#xff0c;博雅仔在与一些创业中的伙伴的沟通过程中了解到&#xff0c;位于一、二线城市的伙伴朋友很有信心&#xff0c;他们坦言&#xff0…

教你免费通配符/泛域名SSL证书怎么申请

申请免费的通配符SSL证书可以让您的主域名及其所有二级子域名都受到安全套接层(SSL)的加密保护&#xff0c;提高网站的整体安全性和用户信任度。以下是一个基于通用流程的简明教程&#xff0c;以JoySSL为例&#xff0c;因为他提供全类别的免费SSL证书。 1、创建证书服务商账号…

STM32自制雾化器

1.1 介绍&#xff1a; 108KHZ雾化器&#xff0c;由驱动模块和雾化器组成&#xff0c;主要作用是把水雾化加湿&#xff1b;它的使用方法有两种&#xff1b;方式1.电源接口供电DC3-4.5V&#xff0c;按下按键&#xff0c;开启雾化器,再按住关&#xff1b;方式2.单片机控制低电平2…

Linux实验 系统管理(二)

实验目的&#xff1a; 了解RPM软件包&#xff1b;掌握使用rpm命令查询、安装、更新、卸载、验证软件包的方法&#xff1b;掌握使用yum命令查询、安装、更新、卸载软件包的方法&#xff1b;了解TAR软件包&#xff1b;掌握使用tar命令创建&#xff08;并压缩&#xff09;、查询、…

SSM校园疫情防控系统JAVA计算机毕业设计项目【附源码】

SSM校园疫情防控系统JAVA计算机毕业设计项目 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1…

python+cv2+gstreamer 推流<500ms低延迟的处理策略

1.一份可用的推流配置 self.out cv2.VideoWriter(appsrc is-liveTrue stream-type0 emit-signalsFalse max-latency1 \ ! videoconvert ! video/x-raw, formatI420 \ ! x264enc speed-presetultrafast bitrate1200 tune"zerolatency" key-int-m…

吉林事业编报名照要求<50kb怎么压缩

吉林事业编报名照要求&#xff1c;50kb怎么压缩