Java之 jvm

jvm之管理内存

  1. 程序计数器:当前线程所执行的字节码的行号指示器。程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。
  2. Java虚拟机栈  方法调用 一个方法调用都会有对应的栈帧被压入栈中 

    局部变量表:各种数据类型、对象引用类型                                                                              操作数栈:用于存放方法执行过程中产生的中间计算结果。另外,计算过程中产生的临时变量也会放在操作数栈中。                                                                                                           栈的内存不允许动态链接,栈会出现StackOverFlowError,当可以动态扩展,但是在扩展的时候没有办法申请到足够的内存空间,则抛出OutOfMemoryError异常。Java 方法有两种返回方式,一种是 return 语句正常返回,一种是抛出异常。不管哪种返回方式,都会导致栈帧被弹出。也就是说, 栈帧随着方法调用而创建,随着方法结束而销毁。无论方法正常完成还是异常完成都算作方法结束。
  3. Java本地方法栈:本地方法栈则为虚拟机使用到的 Native 方法服务。 
  4. 堆  大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 S0 或者 S1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。这里最容易出现OutOfMemoryError 当jvm花太多时间执行垃圾回收比关切只能回收很少的堆空间的时候,就会报这个错误

  5. 元空间是永久代的实现 把永久代换成元空间的原因——整个永久代有一个 JVM 本身设置的固定大小上限,无法进行调整(也就是受到 JVM 内存的限制),而元空间使用的是本地内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。

  6. 运行时常量池:常量池表会在类加载后存放到方法区的运行时常量池中。

  7. 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

  8. 直接内存:直接内存是一种特殊的内存缓冲区,并不在 Java 堆或方法区中分配的,而是通过 JNI 的方式在本地内存上分配的。

  9. 对象的创建——类加载检查、分配内存(指针碰撞、空闲列表,分配方式由Java堆是否规整决定 而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。)——初始化零值——设置对象头(这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。)——执行init方法

  10.  对象在内存中的布局可以分为 3 块区域:对象头(Header)实例数据(Instance Data)对齐填充(Padding)。对齐填充起到占位作用,8字节的整数倍
  11. 对象的访问
  12. 内存分配以及回收原则
  • 优先在Eden区分配,当内存不够的时候会触发Minor GC,Survivor空间内存足够的情况下转入,并将对象年龄设为 1(Eden 区->Survivor 区后对象的初始年龄变为 1)。不足的情况下通过 分配担保机制 把新生代的对象提前转移到老年代中去
  • 大对象直接进老年代
  • 长期存活的对象将进入老年代,对象在 Survivor 中每熬过一次 MinorGC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。
  • Java之垃圾回收

  1. 死亡对象判断方法
  • 引用计数法 有地方引用就加1,引用失效减一。 问题:循环引用
  • 可达性分析算法  GC Roots
  • 引用类型总结: 
  • 强引用:不会回收,内存不足,抛出OutOfMemoryError 错误,
  • 软引用:可有可无,内存不足会回收,与引用队列联合使用
  • 弱引用:一旦发现,不管内存是否足够,都会回收。但是垃圾回收器是一个优先级很低的线程,因此不一定会很快发现。与引用队列联合使用
  • 虚引用:任何时候都可能被回收。主要用来跟踪对象被垃圾回收的活动。
  • 如何判断一个常量是废弃常量?运行时常量池主要回收的是废弃的常量
  • 如何判断一个类是无用的类?  (1)该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。(2)加载该类的 ClassLoader 已经被回收。(3)该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
  1. 垃圾收集算法
  • 标记清除算法:创建对象,标记o;然后可达对象标记为1 ,扫描阶段清除为o的 。内存碎片
  • 复制算法: 内存缩小为原来的一半
  • 标记-整理算法:老年代,标记之后不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后清理掉端边界以外的内存
  • 分代收集算法:根据对象存活周期的不同将内存分为几块,采用不同的收集算法
  1. 垃圾收集器
  • serial收集器:暂停其他所有的工作线程,只用一条垃圾收集线程完成垃圾收集工作。

    新生代采用标记-复制算法,老年代采用标记-整理算法。 简单高效

  • parNew收集器:只是使用多线程区进行垃圾收集

  • parallel scavenge收集器  关注吞吐量 以及cpu资源的场合

  • CMS收集器 是一种以获取最短回收停顿时间为目标的收集器。第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。

  • G1收集器 一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征。G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region

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

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

相关文章

Redis - SpringDataRedis - RedisTemplate

目录 概述 创建项目 引入依赖 配置文件 测试代码 测试结果 数据序列化器 自定义RedisTemplate的序列化方式 测试报错 添加依赖后测试 存入一个 String 类型的数据 测试存入一个对象 优化 -- 手动序列化 测试存入一个Hash 总结: 概述 SpringData 是 S…

《Milvus Cloud向量数据库指南》——BGE-M3:多功能、多语言、多粒度的文本表示学习模型

引言 在自然语言处理(NLP)领域,随着大数据时代的到来,对文本信息的精准处理与高效检索成为了研究热点。BERT(Bidirectional Encoder Representations from Transformers)作为近年来NLP领域的里程碑式模型,以其强大的上下文理解能力在多项任务中取得了显著成效。然而,面…

刘纪鹏:“3万亿资金将股市拉升至4000点”,你能赚?

本周刘纪鹏提出了一个观点:花费3万亿资金将股市拉升至4000点,有望带来25万亿的财富增长。 3万亿的投入与25万亿的潜在增长确实令人心动。股市并非简单的投入资金就能涨,还需要考虑市场情绪、经济基本面等因素的影响。举个例子,某个…

【leetcode 详解】找出区分值(C++思路详解):这【中等】题怎么十分钟就写完了?

评价:就笔者的感觉吧,leetcode上难度标为“中等”的题目往往不是说需要什么高深的算法来解决,但基本都涉及到 “问题转化” 的能力要求,换言之,难点往往在于思维。 tip:要解决这类问题,笔者推荐…

python3.10.4——Windows环境安装

python下载官网:https://www.python.org/downloads/ 如果安装在C盘,需要右键→选择“以管理员身份运行” 勾选2个按钮,选择自定义安装 全部选择,点击Next 更改安装路径 命令行检查python是否安装成功: 出现版本号说明…

如何使用C#自制一个Windows安装包

原文链接:https://www.cnblogs.com/zhaotianff/p/17387496.html 以前都在用InstallShield制作安装包,基本需求是能满足的,但也有一些缺点: 1、界面不能完全定制 2、不能直接调用代码里的功能 平常使用一些其它软件,…

数据结构(Java):Map集合Set集合哈希表

目录 1、介绍 1.1 Map和Set 1.2 模型 2、Map集合 2.1 Map集合说明 2.2 Map.Entry<K&#xff0c;V> 2.3 Map常用方法 2.4 Map注意事项及实现类 3、Set集合 3.1 Set集合说明 3.2 Set常用方法 3.3 Set注意事项及其实现类 4、TreeMap&TreeSet 4.1 集合类TreeM…

嵌入式中什么是三次握手

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 在网络数据传输中&#xf…

pytorch3d的安装

在这个网址中&#xff0c;下载对应的pytorch3d安装包 https://anaconda.org/pytorch3d/pytorch3d/files下载完成后使用下面命令进行安装 conda install ./pytorch3d-0.7.7-py39_cu118_pyt201.tar.bz2

可见性::

目录 定义&#xff1a; 解决方法&#xff1a; ①使用synchronized实现缓存和内存的同步 修改一&#xff1a; 加入语句&#xff1a; 代码&#xff1a; 修改2&#xff1a; 在代码块中加入&#xff1a; 代码&#xff1a; 执行结果&#xff1a; 原因&#xff1a; ②使用…

Linux--Socket 编程 UDP(简单的回显服务器和客户端代码)

目录 0.上篇文章 1.V1 版本 - echo server 1.1认识接口 1.2实现 V1 版本 - echo server&#xff08;细节&#xff09; 1.3添加的日志系统&#xff08;代码&#xff09; 1.4 解析网络地址 1.5 禁止拷贝逻辑&#xff08;基类&#xff09; 1.6 服务端逻辑 &#xff08;代码&…

【C/C++】printf和cout的区别

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

解析资源库架构模式

无论应用程序的设计方法和实现技术如何发展&#xff0c;数据访问仍然是任何系统都需要考虑的基础技术问题。针对数据访问过程&#xff0c;我们可以理解为任何一个系统都应该存在这样一个起点&#xff0c;我们可以从这个起点遍历到具体的数据。换句话说&#xff0c;系统中应该存…

Python爬虫掌握-----4实战(爬取视频)

我们使用爬虫时难免会遇到爬取视频的情况&#xff0c;其实爬取图片视频&#xff0c;内容都是一样的。这里以b站视频为例。 一、开始 1.找到url&#xff0c;请求url 防盗链&#xff0c;需要写在UA伪装中 正常的三步&#xff1a; 1.url 2.requests请求 3.UA伪装 import req…

2024最新网络安全自学路线,内容涵盖3-5年技能提升

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

做一个能和你互动玩耍的智能机器人之二

智能机器人硬件的一些注意事项和知识和初学者的误区。 一。不要担心不会焊接&#xff0c;我也是购买后才发现&#xff0c;现在的很多板子和元器件可以无焊接使用&#xff0c;比如借助杜邦线和面包板&#xff0c;可以很方便连接。 二。arduino有很多种&#xff0c;一般用的是n…

【Java算法专场】二分查找(上)

目录 前言 什么是二分查找&#xff1f; 二段性 ​​​​​​​​​​​​​​​​​​​​​二分查找 算法分析 算法步骤 算法代码 算法示例 模板 在排序数组中查找元素的第一个和最后一个位置 算法分析 算法步骤 算法代码 算法示例 搜索插入位置 算法分析 算法步…

IEC104转MQTT网关支持将IEC104数据转换为华为云平台可识别的格式

随着智能电网和物联网技术的深度融合&#xff0c;传统电力系统中的IEC104协议设备正逐步向更加开放、智能的物联网体系转型。华为云作为全球领先的云计算和AI服务提供商&#xff0c;其物联网平台为IEC104设备的接入与数据处理提供了强大的支撑。本文将探讨IEC104转MQTT网关在MQ…

KETTLE运行出现乱码和无法执行问题及解决方案

一、乱码问题 &#xff08;1&#xff09;出现乱码&#xff0c;在数据库连接里面的选项里面加入&#xff1a;characterEncodingutf8和tinyInt1isBitfalse &#xff08;2&#xff09;取消简易转换&#xff0c;点开表输入&#xff0c;取消”允许简易转换”选项&a…

vue3.0学习笔记(一)——vue3简介与vite脚手架的使用

1. 为什么学vue3 Vue3现状&#xff1a; vue-next 2020年09月18日&#xff0c;正式发布vue3.0版本。但是由于刚发布周边生态不支持&#xff0c;大多数开发者处于观望。现在主流组件库都已经发布了支持vue3.0的版本&#xff0c;其他生态也在不断地完善中&#xff0c;这是趋势。…