【面试】Java最新面试题资深开发-JVM第二弹

问题三:JVM 内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为 Eden 和 Survivor

为什么要分成新生代和老年代:

  1. 对象生命周期假设:

    • 大多数对象在被创建后很短时间内就会变成垃圾。通过将这些短命的对象放入新生代,可以更频繁地进行垃圾回收,提高垃圾回收的效率。
  2. 提高垃圾回收效率:

    • 新生代使用较轻量的垃圾回收算法,例如复制算法。这种算法适用于大量短命对象的场景,可以更快速地完成垃圾回收。
  3. 避免内存碎片问题:

    • 在新生代中,采用了复制算法,避免了由于对象的频繁创建和销毁导致的内存碎片问题。复制算法可以确保内存的连续性,提高内存的利用率。
  4. Full GC的优化:

    • 将新生代和老年代分开管理,可以减少新生代垃圾回收引发的Full GC的频率。Full GC是一种相对耗时的操作,通过减少其发生的次数,可以提高整体的性能。

新生代的划分:Eden区和Survivor区:

  1. Eden区:

    • Eden区是新生代的主要工作区域,用于存放新创建的对象。
    • 大多数对象在新生代创建后会很快变成垃圾,因此将它们放入Eden区,以便更频繁地进行垃圾回收。
  2. Survivor区:

    • Survivor区用于存放在新生代中经过一次垃圾回收后仍然存活的对象。
    • Survivor区被分为两部分,通常称为S0和S1。在每次垃圾回收后,存活的对象会被从上一轮的From区(例如S0)复制到To区(例如S1),而非存活的对象将被清理。

详细过程:

  1. 对象创建:

    • 当新对象被创建时,它们首先会被分配到Eden区。
  2. Eden区垃圾回收(Minor GC):

    • 当Eden区满时,会触发Minor GC。在Minor GC中,存活的对象将被复制到Survivor区,非存活的对象将被清理。
  3. Survivor区垃圾回收:

    • 存活对象会从上一轮的From区复制到To区。在下一次Minor GC时,From区和To区的角色会互换。
  4. 对象老化:

    • 在Survivor区中经过多次存活的对象,最终会被晋升到老年代。
  5. 老年代垃圾回收(Major GC/Full GC):

    • 当老年代满时,会触发Major GC或Full GC。老年代的垃圾回收比新生代的垃圾回收频率低,一般耗时较长。

通过以上划分,JVM可以根据对象的生命周期采用不同的垃圾回收策略,提高整体的垃圾回收效率,确保内存的有效利用。这样的划分有助于避免全局性的垃圾回收频率过高,提高应用程序的性能。

在这里插入图片描述

问题四:常用的 JVM 调优的参数都有哪些?

当进行JVM调优时,可以通过调整不同的参数来优化Java应用程序的性能。以下是一些常用的JVM调优参数的详细解释:

1. 堆设置(Heap Settings):

  • -Xms: 设置初始堆大小。这个参数表示Java应用程序启动时分配给Java虚拟机的初始堆大小。例如,-Xms512m 表示初始堆大小为512MB。

  • -Xmx: 设置最大堆大小。这个参数表示Java虚拟机在运行过程中可以分配的最大堆大小。例如,-Xmx1024m 表示最大堆大小为1GB。

  • -Xmn: 设置新生代(Young Generation)的大小。新生代是用于存放新创建的对象的区域。例如,-Xmn256m 表示新生代大小为256MB。

2. 垃圾回收相关(Garbage Collection):

  • -XX:+UseSerialGC: 使用串行垃圾回收器。适用于单核CPU环境。

  • -XX:+UseParallelGC: 使用并行垃圾回收器。适用于多核CPU环境。

  • -XX:+UseConcMarkSweepGC: 使用CMS(Concurrent Mark-Sweep)垃圾回收器。适用于要求低停顿时间的应用。

  • -XX:+UseG1GC: 使用G1(Garbage First)垃圾回收器。适用于大堆、多核心、需要低停顿时间的应用。

3. 垃圾回收统计信息:

  • -XX:+PrintGCDetails: 打印详细的垃圾回收信息。这个参数会输出垃圾回收的详细信息,包括每次垃圾回收的耗时等。

  • -XX:+PrintGCDateStamps: 在垃圾回收日志中打印时间戳。这个参数会在垃圾回收日志中显示时间戳,方便分析。

4. 调整线程池(Thread Pool):

  • -Xss: 设置线程栈的大小。线程栈的大小会影响线程的创建和销毁。例如,-Xss256k 表示线程栈的大小为256KB。

  • -XX:MaxPermSize=: 设置永久代(JDK8之前的版本)的最大大小。例如,-XX:MaxPermSize=256m 表示最大永久代大小为256MB。

5. 性能监控和故障处理:

  • -XX:OnOutOfMemoryError=: 在OutOfMemoryError发生时执行指定的命令。可以配置一些故障处理的命令,例如记录日志、发送通知等。

  • -XX:+HeapDumpOnOutOfMemoryError: 在OutOfMemoryError发生时生成堆转储文件。这个文件可以用于分析内存溢出问题。

6. 调整应用程序性能:

  • -XX:CompileThreshold=: 设置JIT编译的阈值。这个参数表示方法被调用多少次后进行JIT编译。例如,-XX:CompileThreshold=1000 表示在方法被调用1000次后进行JIT编译。

  • -XX:+OptimizeStringConcat: 启用字符串拼接的优化。这个参数可以提高字符串拼接的性能。

7. JIT 编译器(Just-In-Time Compiler):

  • -XX:+PrintCompilation: 打印方法的JIT编译信息。这个参数用于查看哪些方法被JIT编译。

  • *-XX:CompileCommand=print, ClassName.methodName: 打印指定类的指定方法的JIT编译信息。

8. 其他参数:

  • -XX:ParallelGCThreads=: 设置并行垃圾回收器的线程数。这个参数可以根据CPU核心来定。

  • 如果对你有用,请给个在看,谢谢~~欢迎各位留言交流,
  • 如有不正确的地方,请予以指正。【W:编程心声】
  • 如有任何问题,关注公众号编程心声后,留言即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码混淆技术探究与工具选择

代码混淆技术探究与工具选择 引言 在软件开发中,保护程序代码的安全性是至关重要的一环。代码混淆(Obfuscated code)作为一种常见的保护手段,通过将代码转换成难以理解的形式来提升应用被逆向破解的难度。本文将介绍代码混淆的概…

vue2+datav可视化数据大屏(2)

接上一节所说 我们已经讲骨架搭好 这节我们讲述的如何在vue2中使用mock数据和封装axios 1,项目中使用moke 📓什么是mock?,mock就是假数据,除了数据是假的,其他内容都和正常工作中后端开发的接口都是一致的…

3.PyTorch——常用神经网络层

import numpy as np import pandas as pd import torch as t from PIL import Image from torchvision.transforms import ToTensor, ToPILImaget.__version__2.1.13.1 图像相关层 图像相关层主要包括卷积层(Conv)、池化层(Pool)…

KP 2sv Authenticator一款免费处理亚马逊两步验证码的软件

KP 2sv Authenticator 被誉为一款免费而强大的亚马逊两步验证软件,操作简便轻松。 软件使用方法极为简单,用户只需直接输入身份验证应用程序生成的代码,即可迅速生成随机验证码,帮助用户顺利完成亚马逊的两步验证流程。这款小软件…

dockers安装rabbitmq

RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQhttps://www.rabbitmq.com/ Downloading and Installing RabbitMQ — RabbitMQ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 之后参照:dock…

基于个微机器人的开发

简要描述: 下载消息中的动图 请求URL: http://域名/getMsgEmoji 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…

【EXCEL】折线图添加垂直x轴的竖线|画图

相关链接:excel 添加垂直竖向直线 如何在Excel中添加水平和垂直线? 因为加辅助列有点不习惯,已经有分位数横坐标了,想着试下用散点图的误差线画 效果图: 步骤: s1:随便框选两列数据–>插入(…

Android hook式插件化详解

引言 Android插件化是一种将应用程序的功能模块化为独立的插件,并动态加载到主应用程序中的技术。通过插件化,开发者可以将应用程序的功能分解成独立的模块,每个模块可以作为一个插件单独开发、测试和维护,然后通过动态加载的方式集成到主应用程序中,实现功能的动态扩展和…

香港云服务器:全面介绍与使用场景分析

这几年基于国内互联网技术的发展,各类海外贸易的兴起,很多网站都启用了海外云服务。这其中,香港的 IDC 市场异常火爆。也不奇怪,就目前来看,国内大多数网站的访问用户在国内外均有涉及,而香港云服务器恰好满…

linux云服务器开启防火墙注意事件

重要的事情先说三遍: linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! linux云服务器开启防火墙要先获取到云服务器的管理界面控制权!! 也就是能打开这个页面: 为什么这么说呢?如果你…

最长连续序列(leetcode 128)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一:排序方法二:哈希表 5.实现示例参考文献 1.问题描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你…

服务器RAID系统的常见故障,结合应用场景谈谈常规的维修处理流程

常见的服务器RAID系统故障包括硬盘故障、控制器故障、电源故障、写入错误和热插拔错误。下面结合这些故障的应用场景和常规维修处理流程来详细讨论: 硬盘故障: 应用场景:在服务器RAID系统中,硬盘故障是最常见的问题之一。硬盘可能…

JavaSE基础50题:10. 计算1/1-1/2+1/3-……+1/99-1/100的值(两种方法)

概述 计算1/1 - 1/2 1/3 - …… 1/99 - 1/100的值。 当分母为偶数时,符号是负的,放分母为奇数时,符号是负的。 方法一 用 flg 做了一个正负交替 【代码】 public static double func() {double sum 0;int flg 1; //设置正负号的for (i…

【Python】Python音乐网站数据+音频文件数据抓取(代码+报告)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

优化 SQL 日志记录的方法

为什么 SQL 日志记录是必不可少的 SQL 日志记录在数据库安全和审计中起着至关重要的作用,它涉及跟踪在数据库上执行的所有 SQL 语句,从而实现审计、故障排除和取证分析。SQL 日志记录可以提供有关数据库如何访问和使用的宝贵见解,使其成为确…

住宅ip和机房ip的区别

随着互联网的普及,越来越多的人开始接触网络,而IP地址则是网络中不可或缺的一部分。在日常生活中,我们常常会听到住宅IP和机房IP这两个概念,那么它们之间有什么区别呢? 首先,让我们了解一下什么是住宅IP和…

Python上网神器,自动修改Hosts工具

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python上网神器,自动修改Hosts工具,全文6400字,阅读大约18分钟。 在互联网时代,Hosts 文件的修改是一项常见的任务&#xf…

Vue.js 学习总结(4)—— Vue3响应式系统原理

概念 响应式是指当数据发生变化时,系统会自动更新与数据相关的 DOM 结构。在 Vue2 中,响应式系统的实现基于 Object.defineProperty。然而,Object.defineProperty 有一些局限,如:无法监听数组的变化、需要遍历对象的每…

MS8091/2运算放大器可Pin to Pin兼容AD8091/2

MS809x 系列是一种易用的、低成本的轨到轨输出电压反馈放大器,它具有典型的电流反馈放大器带宽和转换率的优势,同时也有较大的共模电压输入范围和输出摆幅,这使它很容易在单电源 2.5V 的低压情况下工作。可Pin to Pin兼容AD8091/AD8092。 虽然…

DAP数据集成与算法模型如何结合使用

企业信息化建设会越来越完善,越来越体系化,当今数据时代背景下更加强调、重视数据的价值,以数据说话,通过数据为企业提升渠道转化率、改善企业产品、实现精准运营,为企业打造自助模式的数据分析成果,以数据…