JAVA每日面经——JVM篇(包含JVM优化)

👩🏽‍💻个人主页:阿木木AEcru

🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》

💹每一次技术突破,都是对自我能力的挑战和超越。

一、什么是JVM?

Java虚拟机(JVM)是Java编程语言的核心组件之一,是一个能够执行Java字节码的虚拟机器。它是Java跨平台特性的关键所在,允许Java程序在不同的操作系统上运行,而不需要重新编译成特定平台的机器码。JVM负责将Java源代码编译成字节码,然后在运行时解释或编译执行这些字节码。

二、JVM由什么组成?

在这里插入图片描述

  • 程序计数器:是当前线程执行的字节码行号的指示器,用于记录正在执行的虚拟机字节指令地址。它是线程私有的,每个线程都有自己的程序计数器。
  • Java虚拟栈:存放基本数据类型、对象引用以及方法出口等数据。它也是线程私有的,每个线程都有自己的虚拟栈。
  • Native方法栈:与Java虚拟栈相似,但它专门为Native方法服务。也是线程私有的,用于执行本地方法。
  • Java堆:是Java内存中最大的一块,用于存放所有的对象实例和数组。Java堆是垃圾收集器的主要工作区域,所有的垃圾收集都是在这里进行的。Java堆是线程共享的内存区域。
  • 方法区:存放已被加载的类信息、常量、静态变量以及即时编译器编译后的代码数据等。也称为永久代,但在较新的JVM中可能已被元空间所取代。方法区的主要回收目标是常量池的回收和类型的卸载。方法区是各个线程共享的内存区域。

三、JVM 内存为什么要分成新生代,老年代,持久代?

在这里插入图片描述

在Java虚拟机中,内存被划分为几个区域,其中包括持久代和堆。持久代主要用于存放方法区和一些其他的数据。而堆则包括了新生代和老年代。

新生代和老年代 Java堆被划分为新生代和老年代。新生代是存放刚创建的对象的地方,而老年代则是存放已经存在一段时间且存活时间较长的对象。

Survivor区的作用 Survivor区主要是为了帮助管理新生代的内存。如果没有Survivor区,新生代的Eden区每次进行垃圾回收时都会把存活的对象移到老年代,这会导致老年代很快被填满,触发大规模的垃圾回收。为了避免这种情况,引入了Survivor区。Survivor区的存在能够减少被送到老年代的对象,进而减少大规模垃圾回收的发生。

为什么要设置两个Survivor区 设置两个Survivor区最主要的目的是为了解决内存碎片化问题。当新生代的Eden区满了之后,存活的对象会被移动到第一个Survivor区。随着新的对象不断被创建和销毁,Eden区和第一个Survivor区的内存会逐渐被占满。当这两个区域再次满了之后,会触发一次垃圾回收,这时会把Eden区和第一个Survivor区中的存活对象移到第二个Survivor区,同时清空Eden区。这个过程的重要性在于,这种移动对象的方式保证了第二个Survivor区中来自Eden区和第一个Survivor区的存活对象在内存中是连续的,避免了内存碎片化的问题。

四、JVM如何优化?

1.1 堆栈相关配置

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:MaxPermSize=16m -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=0  

解释: -

Xmx3550m:设置最大堆大小为 3550m。

-Xms3550m:设置初始堆大小为 3550m。

-Xmn2g:设置年轻代大小为 2g。

-Xss128k:设置每个线程的堆栈大小为 128k。

-XX:MaxPermSize:设置持久代大小为 16m。

-XX:NewRatio=4:设置年轻代与年老代的大小比值为 1:4(不包括持久代)。

-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值为 1:4。 如果SurvivorRatio为4,则两个Survivor区与一个Eden区的大小比值为 2:4,一个Survivor区占整个年轻代的 1/6。

-XX:MaxTenuringThreshold=0:设置对象在年轻代中的最大年龄。如果设置为0,则年轻代对象不经过Survivor区,直接进入年老代。

1.2 垃圾收集器相关配置

-XX:+UseParallelGC:选择并行垃圾收集器,这种收集器会使用多个线程并行地进行垃圾回收操作。

-XX:ParallelGCThreads=20:配置并行收集器使用的线程数为20,这样可以充分利用多核处理器的性能。

-XX:+UseConcMarkSweepGC:设置年老代使用并发标记-清除收集器,这种收集器允许垃圾回收和应用程序线程同时运行,减少了停顿时间。

-XX:CMSFullGCsBeforeCompaction=5:配置在对年老代进行压缩整理之前触发多少次Full GC。这个参数指定了在进行内存整理之前,需要进行多少次Full GC操作。

-XX:+UseCMSCompactAtFullCollection:开启在Full GC时对年老代进行压缩整理。虽然可能会略微影响性能,但可以帮助消除内存碎片,从而提高内存的利用效率。

五、结尾

感谢您的观看! 如果本文对您有帮助,麻烦用您发财的小手点个三连吧!您的支持就是作者前进的最大动力!再次感谢!

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

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

相关文章

酷开系统用电视为居家生活打开精彩窗口|酷开科技|酷开会员|

随着互联网的发展,电视也承载了更多的功能。相比于传统的电视,如今的智能电视屏幕更大、分辨率更高、色彩更加鲜艳,能够呈现出更加逼真的画面效果。当观众观看大屏电视时,仿佛置身于电影大幕的场景之中,感受到更为震撼…

html常见标签

width宽度 height高度 border边框 1px(边框线条宽度) solid(实线) red(红色) border-radius: 100px 边框圆角 background-color:red(背景颜色为红色) margin&#xf…

2024年最新Anaconda3 2024版中Jupyter Notebook安装

一、 Anaconda3 2024版下载 1.下载:Free Download | Anaconda 2.等待 解释:默认选择等等下载 ,时间可能数分钟 3.安装 解释:打开刚刚下载的Anaconda Navigator,并如图安装低版本,高版本会直接报错 4. …

CSS学习笔记:transform属性实现元素的位移、旋转、缩放

位移 实现居中的两种方法 绝对定位的盒子在父盒子中实现居中效果有两种方法 法一:margin 其中,left和top的值分别为子盒子自身宽高的一半 法二:translate 实现过渡效果 translate常常配合hover和transition使用,以实现鼠标悬停…

微博修改密码后无法通过微博开放接口发送微博

生产环境,因密码修改导致授权失效致接口发送微博失效!内部网站编辑完博文后无法发送微博。在修改密码时,有提示授权应用失效,操作人员不清晰情况,直接忽视。 微博应用开放接口----》微博转发博文接口文档 无示例 遗憾…

突破边界:Web3开启数字化社会的新纪元

引言 随着科技的不断进步和数字化社会的发展,Web3正逐渐成为了人们关注的焦点。作为新一代互联网的演进形态,Web3具有突破传统边界、实现去中心化的特点,被认为将开启数字化社会的新纪元。本文将深入探讨Web3的概念、特点、应用场景&#xf…

【LeetCode: 224. 基本计算器 + 模拟 + 栈】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Java的集合体系及相关数据结构---Collection系列

​​​​​​​ 其中,有序和无序是指存取时候的顺序一致或者不一致; Collection是单列集合的顶层接口,它的方法全部单列集合可用。 Collection方法 方法名说明boolean add(E e)添加元素boolean remove(Object o)从集合中移除指定的元素…

语音转文字——sherpa ncnn语音识别离线部署C++实现

简介 Sherpa是一个中文语音识别的项目,使用了PyTorch 进行语音识别模型的训练,然后训练好的模型导出成 torchscript 格式,以便在 C 环境中进行推理。尽管 PyTorch 在 CPU 和 GPU 上有良好的支持,但它可能对资源的要求较高&#x…

HarmonyOS 应用开发案例

本帖下方集中了HarmonyOS Next应用开发时,会遇到的常见应用案例。后续会持续更新大量案例,帮助开发者快速学习。欢迎感兴趣的同学加入Q:454901491 72.手写绘制及保存图片案例(0319更新)(点此查看源码实现&…

Windows10无盘母盘制作-以云更新为例

Windows10无盘母盘制作-以云更新为例 缘起环境准备创建虚拟机安装系统导出系统 缘起 网吧客户端在实际环境中,经常要面对形形色色对无盘系统,五花八门对无盘镜像, 为了方便确认不同无盘环境对客户的对影响,决定自己制作一个无盘母…

【python + Django】Django模板语法 + 请求和响应

前言: 现在现在,我们要开始将变量的值展现在页面上面啦! 要是只会显示静态页面,我们的页面也太难看和死板了, 并且数据库的数据也没法展现在页面上。 但是呢,模板语法学习之后就可以啦!&…

【大模型服务】01EdgeFM: Leveraging Foundation Model for Open-set Learning on the Edge

该文发表在 SenSys’23(CCF B) 上,作者是来自港中文的鄢振宇。这是一篇关于云端协同的文章,主要解决边缘设备深度模型的泛化性不足问题,实现 Open-set Learning。 文章目录 背景Open-Set Recognition 的挑战EdgeFM 整体架构图云端&#xff1…

21---EEPROM电路设计

视频链接 EEPROM电路设计01_哔哩哔哩_bilibili EEPROM电路设计 1、存储器的分类 一般根据掉电丢失来划分的存储器。可分为易失性存储器和非易失性储存器。 ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据。 1.1、易失性存储器-R…

升级 HarmonyOS 4 版本,腕上智慧更进一步

HUAWEI WATCH GT 3 系列升级 HarmonyOS 4 新版本后,手表体验更进一步,快来看看有哪些变化吧~

如何进行端口映射端口转发?

在互联网时代,网络安全成为一项重要的任务。端口映射端口转发是一种常用的网络安全技术,它可以实现远程访问内部网络资源的需求。本文将介绍端口映射端口转发的基本原理和应用场景,以及一种名为"天联"的解决方案。 基本原理 端口映…

种植新革命:科技赋能绿色未来

《种植新革命:科技赋能绿色未来》 一、种植技术的颠覆式创新 随着科技的飞速发展,种植技术也在经历一场颠覆式的创新。传统的种植方式,虽然历史悠久,经验丰富,但在面对现代化、大规模、高效的需求时,逐渐…

LeetCode每日一题——最后一个单词的长度

最后一个单词的长度OJ链接:58. 最后一个单词的长度 - 力扣(LeetCode) 题目: 思路 : 统计字符串中最后一个单词的长度,那么我们可以定一一个指针,从后向前开始统计,当指针指向的元素…

【LabVIEW FPGA入门】局部变量和全局变量

局部变量 无法访问某前面板对象或需要在程序框图节点之间传递数据时,可创建前面板对象的局部变量。创建局部变量后,局部变量仅仅出现在程序框图上,而不在前面板上。 局部变量可对前面板上的输入控件或显示件进行数据读写。写入局部变量相当于…

流畅的 Python 第二版(GPT 重译)(十三)

第二十四章:类元编程 每个人都知道调试比一开始编写程序要困难两倍。所以如果你在编写时尽可能聪明,那么你将如何调试呢? Brian W. Kernighan 和 P. J. Plauger,《编程风格的要素》 类元编程是在运行时创建或自定义类的艺术。在 P…