Java每日面试题(JVM)(day15)

目录

  • Java对象内存布局
  • markWord 数据结构
  • JDK1.8 JVM 内存结构
  • JDK1.8堆内存结构
  • GC垃圾回收
    • 如何发现垃圾
    • 如何回收垃圾
  • JVM调优参数

Java对象内存布局

Java对象内存布局

markWord 数据结构

markWord数据结构

JDK1.8 JVM 内存结构

JVM内存模型
在这里插入图片描述

  • 程序计数器:
    线程私有,记录代码执行的位置.

  • Java虚拟机栈:
    线程私有,每个线程都有一个自己的Java虚拟机栈 ,默认大小是1M

  • 本地方法栈:
    线程私有,每个线程都有一个自己的本地方法栈,Java虚拟机栈加载的是普通方法,本地方法加载的是native修饰的方法.

    native:表示这个方法不是java原生的,是由C或C++实现的

  • :
    线程共享用于存放对象,new的对象都存储在这个区域

  • 元空间:
    线程共享,存储class信息,类的信息,方法的定义,静态变量常量池

  • 堆和元空间是线程共享的,在Java虚拟机中只有一个堆一个元空间,并在JVM启动的时候就创建,JVM停止才销毁。
  • 栈、本地方法栈、程序计数器是每个线程私有的,随着线程的创建而创建,随着线程的结束而死亡。

每个存储位置会产生的异常
每个位置可能会产生的错误

JDK1.8堆内存结构

堆内存结构

  • 年轻代:Eden+S0+S1, S0和S1大小相等, 新创建的对象都在年轻代
  • 老年代:经过年轻代 多次垃圾回收存活下来的对象存在年老代中.

GC垃圾回收


JVM的垃圾回收动作可以大致分为两大步:

  1. 如何发现垃圾
  2. 如何回收垃圾

线程私有的不存在垃圾回收,只有线程共享的才会存在垃圾回收,所以堆中存在垃圾回收.

如何发现垃圾


常见的用于「发现垃圾」的算法有两种,引用计数算法根搜索算法

  1. 引用计数算法
    堆中的对象每被引用一次,则计数器加1,每减少一个引用就减1,当对象的引用计数器为0时可以被当作垃圾收集。

    • 优点:快。
    • 缺点:无法检测出循环引用。如两个对象互相引用时,他们的引用计数永远不可能为0。
  2. 根搜索算法(也叫根可达性分析)
    根搜索算法是把所有的引用关系 看作一张图,从根节点(GCRoot)开始遍历,找出被根节点引用的节点,对于没有被根节点指向的节点,即可以当作垃圾。

    • Java中可作为GCRoot的对象有:
      1. java虚拟机栈中引用的对象
      2. 本地方法栈引用的对象
      3. 元空间中静态属性引用的对象
      4. 元空间中常量引用的对象

如何回收垃圾


Java中用于「回收垃圾」的常见算法有4种:

  1. 标记-清除算法(markandsweep)
    首先标记出所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象。

    缺点: 标记清除之后会产生大量的不连续的内存碎片

  2. 标记-整理算法
    首先标记出所有需要回收的对象,让所有存活的对象移动到另一个位置,在移动过程中清理掉可回收的对象,这个过程叫做整理

    优点:内存被整理后不会产生大量不连续内存碎片
    缺点:耗时耗力

  3. 复制算法(copying)
    将空间分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。

    缺点:可使用的内存只有原来一半。在某一个时刻点,总有一个 S 是空的,可能是S0 也可能是S1.。

  4. 分代收集算法(generation)
    当前主流JVM都采用分代收集(GenerationalCollection)算法,这种算法会根据对象存活周期的不同将内存划分为年轻代、年老代,不同生命周期的对象可以采取不同 的回收算法,以便提高回收效率。

    • 年轻代(YoungGeneration)

      1. 所有新生成的对象首先都是放在年轻代的。
      2. 新生代内存按照8:1:1的比例分为一个eden区和两个Survivor(s0,s1)区。大部分对象在Eden区中生成。

      回收流程:
      回收时先将eden区存活的对象复制到一个s0区,然后清空eden区,当这个s区,也存放满了时,则将eden区和s0区存活对象复制到另一个s1区,然后清空eden和这个s0区,此时s0区是空的,然后将s0区和s1区交换,即保持s1区为空,如此往复.

      1. 特殊情况:当一个大对象不足于存放到eden区时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次FullGC,也就是新生代、老年代都进行回收。

      2. 新生代发生的GC也叫做MinorGC,MinorGC发生频率比较高

    • 年老代(OldGeneration)

      1. 在年轻代中经历了 N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。默认是15次,且最大15次。

      2. 内存比新生代也大很多(大概是2倍),当老年代内存满时触发FullGC,
        FullGC发生频率比较低,老年代对象存活时间比较长,存活率比较高。

    • 元空间-持久代(PermanentGeneration)
      用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响。

JVM调优参数

这里只给出一些常见的性能调优的参数及其代表的含义。

-Xms8g: 设置JVM中堆初始堆大小为8g。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmx8g: 设置JVM中堆最大可用内存为8g。

-Xmn4g: 设置年轻代大小为4G。

-XX:NewRatio=2 设置年轻代(包括Eden和两个Survivor区)与年老代的比值。设置为2,则年轻 代与年老代所占比值为1:2,年轻代占整个堆栈的1/3。

-XX:SurvivorRatio=8 ,所以默认值 Eden:S0:S1=8:1:1。

-Xss1m:设置每个线程的栈大小

-XX:MaxMetaspaceSize=128m: 设置元空间最大为为128m ,

-XX:MetaspaceSize=128m 用于设置元空间的初始大小, 默认值约21M

-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。 对于年老代比较多的应用,可以提高效率。最大不超过15。

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

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

相关文章

HarmonyOS鸿蒙系统开发应用程序,免费开源DevEco Studio开发工具

DevEco Studio 是华为为 HarmonyOS 和 OpenHarmony 开发者提供的官方集成开发环境(IDE),它基于 IntelliJ IDEA Community 版本打造,提供了代码编辑、编译、调试、发布等一体化服务。 一、DevEco Studio支持系统 DevEco Studio支持…

Centos怎么执行脚本

方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本 cd /data/shell ./hello.sh 方法二:以绝对路径的方式去执行bash shell脚本 /data/shell/hello.sh 方法三:直接使用bash 或sh 来执行…

中国算力大会启幕,联想发布异构智算产业创新成果

9月27日,2024中国算力大会在河南郑州拉开帷幕。作为全球领先的算力基础设施和服务提供商,联想集团参会参展并携手异构智算产业联盟承办2024异构智算产业生态联盟技术论坛。 据「TMT星球」了解,论坛发布了新一代AI服务器、AI应用部署解决方案…

飞睿智能实时雷达活体探测传感器模块,智能家居静止检测实时感知人员有无

随着科技的飞速发展,我们的生活正在经历着未有的创新。在这个创新的浪潮中,实时雷达活体探测传感器模块的技术正逐渐崭露头角,以其独特的优势为我们的生活带来安全与便捷。今天,我们就来详细探讨一下这项技术,看看它是…

Spring Boot 学习之路 -- 配置项目

前言 最近因为业务需要,被拉去研究后端的项目,代码框架基于 Spring Boot,对我来说完全小白,需要重新学习研究…出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门到精…

python-4-4-编程规范2

str1 ,str2 input("请输入两个学生的姓名,用空格分开").split() print(str1) print(str2)print("hello python")name "Jim" print("His name is :",name)a "hello" b "python" print(a,b)print(&q…

ResNet50V2:口腔癌分类

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 ResNet和ResNetV2对比 改进点:(a)original表示原始的ResNet的残差结构,(b)proposed表示新的ResNet的残差结构,主要差别就是(a)结构先卷积后进行BN和激活函数…

原生app云打包,更换图标,和名称。PDA的安装正式包

原生app云打包 复制下载即可,是正式版

Python批量处理客户明细表格数据,挖掘更大价值

批量处理 .xls 数据并进行归类分析以挖掘内在价值,通常涉及以下步骤: 读取数据:使用 pandas 库读取 .xls 文件。数据清洗:处理缺失值、异常值、重复值等。数据转换:对数据进行必要的转换,如日期格式统一、…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示,现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了,先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…

RP2040 C SDK GPIO和IRQ 唤醒功能使用

RP2040 C SDK GPIO和中断功能使用 SIO介绍 手册27页: The Single-cycle IO block (SIO) contains several peripherals that require low-latency, deterministic access from the processors. It is accessed via each processor’s IOPORT: this is an auxiliary…

PHP基础知识

一、PHP变量&#xff1a; 变量是用于存储信息的"容器" <?php$x5;$y6;$z$x$y;echo $z; ?> 在 PHP 中&#xff0c;这些$字母被称为变量。 PHP 变量 变量可以是很短的名称&#xff08;如 x 和 y&#xff09;或者更具描述性的名称&#xff08;如 age、carname、…

【Java异常】(简简单单拿捏)

【Java异常】&#xff08;简简单单拿捏&#xff09; 1. 异常的简单介绍2. 异常的抛出2.1 语法 3. 异常的处理3.1 异常声明throws3.2 try-catch捕获并处理 4. 例子&#xff08;try-catch自定义异常&#xff09; 1. 异常的简单介绍 程序员在运行代码时会遇到很多异常&#xff0c…

学习threejs,绘制二维线

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制二维线1. ☘️…

基于Hive和Hadoop的保险分析系统

本项目是一个基于大数据技术的保险分析系统&#xff0c;旨在为用户提供全面的汽车保险信息和深入的保险价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…

2016年国赛高教杯数学建模A题系泊系统的设计解题全过程文档及程序

2016年国赛高教杯数学建模 A题 系泊系统的设计 近浅海观测网的传输节点由浮标系统、系泊系统和水声通讯系统组成&#xff08;如图1所示&#xff09;。某型传输节点的浮标系统可简化为底面直径2m、高2m的圆柱体&#xff0c;浮标的质量为1000kg。系泊系统由钢管、钢桶、重物球、…

SpringBoot使用EasyPoi根据模板导出word or pdf

1、导出效果 1.1 wrod 1.2 pdf 2、依赖 <!--word--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version></dependency><dependency><groupId>cn.…

探讨TikTok直播专线的必要性

随着社交媒体的迅速发展&#xff0c;短视频平台如TikTok&#xff08;在中国抖音&#xff09;已成为现代人生活中不可或缺的一部分。TikTok的直播功能因其即时性和互动性受到广泛喜爱&#xff0c;但在中国市场上&#xff0c;主播们在使用这一功能时面临不少挑战&#xff0c;其中…

优选拼团平台架构解析与关键代码逻辑概述

一、系统架构设计 唐古拉优选拼团平台采用多层架构设计&#xff0c;主要包括前端展示层、业务逻辑层、数据访问层及数据存储层。 前端展示层&#xff1a;负责用户界面的展示和交互&#xff0c;包括商品列表、拼团详情、订单管理等页面。前端采用现代前端框架&#xff08;如Vue…

【Linux】图解详谈HTTPS的安全传输

文章目录 1.前置知识2.只使用对称加密3.只使用非对称加密 因为私钥加密只能公钥解开&#xff0c;公钥加密只能私钥解开4.双方都是使用非对称加密5.非对称加密 对称加密6.非对称加密对称加密CA认证&#xff08;一&#xff09;CA认证&#xff08;二&#xff09;https &#xff0…