Java之 jvm

news2024/11/25 16:05:28

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://www.coloradmin.cn/o/1941657.html

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

相关文章

【如何在Jenkins的从节点切换NPM镜像源查看和切换】

【问题】 Jenkins打包时,前端npm构建时很慢,所有需要更换镜像源 【自查】 找到Jenkins从节点上的nodejs安装的路径,进入bin目录 执行./npm -v查看是不能正常查看, [rootlocalhost bin]# ./npm -v /usr/bin/env: ‘node’: No su…

华为OD机试2024年C卷D卷 - 山脉的个数/攀登者1 (Java)

华为OD机试(C卷D卷)2024真题目录 题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如&#xff…

MySQL面试篇章——MySQL核心SQL(基本语法)

文章目录 结构化查询语句SQL库操作表操作CURD 操作insert 增加update 修改delete 删除 select 查询去重 distinct空值查询union 合并查询带 in 子查询分页查询排序 order by分组 group by笔试实践题 连接查询内连接查询外连接查询左连接查询右连接查询 结构化查询语句SQL SQL是…

内置对象的原型继承

Object.prototype(原型链顶部) console.log(ItShare.__proto__); console.log(ItShare.__proto__.__proto__); console.log(ItShare.__proto__.__proto__.__proto__);那么数组的原型链是什么呢? const arr [1, 2, 5, 4, 55, 66, 54]; cons…

matlab2018b安装

1.可先参考这个 2.激活 按上面教程安装后,打开matlab 可能会出现软件激活这个界面,需要按如下步骤进行操作。

Android Studio 中使用switch语句时报错Constant expression required

发现问题 Android Studio 中使用switch语句时报错Constant expression required 解决方法: 首先, 在gradle.properties配置文件下添加代码: android.nonFinalResIdsfalse之后, 点击:“Sync Now” 进行同步 效果 原…

《梦醒蝶飞:释放Excel函数与公式的力量》18.2 数据可视化技术

第18章:创建图表和数据可视化 18.2 数据可视化技术 数据可视化是将数据转化为图形和图表的过程,以便更好地理解和分析数据。有效的数据可视化可以揭示数据的模式、趋势和异常,从而帮助做出更明智的决策。以下将介绍几种常用的数据可视化技术…

【C++】————搜索二叉树

作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年7月22日 什么是二叉搜索树? 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0…

大模型学习笔记 - LLM指令微调

LLM 指令微调 LLM 指令微调 0. 概览1. 指令数据的构建 1.1 基于现有NLP任务数据集构建1.2 基于日常对话数据构建1.3 基于合成数据构建1.4 指令数据构建的提升方法 2. 指令微调的策略 2.1 优化设置2.2 数据组织策略 3. 参数高效的模型微调 3.1 低秩适配微调方法3.2 其他高效微调…

【跨链机制】哈希锁定原理

随着区块链多年来的发展,在区块链生态中已经形成了不同特性的区块链网络,这些网络之间存在着一定的隔离和孤立性。为了打破这种局面,跨链技术应运而生,促进了区块链间的数据流通和价值交换。目前,主流的跨链机制包括公…

电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)

参考链接1: 电子设计教程29:滞回比较器(施密特触发器) 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓:施密特触发器,正反馈的妙用 参考链接4: 比较器反馈电阻选多大?理解滞后效应,轻…

Kafka之存储设计

文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构 在一个多 broker 的 Kafka 集…

如何学习Linux:糙快猛的大数据之路( 只讲大数据开发用到的)

引言 还记得第一次面对Linux命令行时的茫然吗?黑乎乎的终端,闪烁的光标,还有那些看起来像外星文的命令。 作为一个从0基础开始跨行到大数据领域的开发者,我深深体会到了学习Linux的重要性和挑战。今天,我想和大家分享…

谷粒商城实战-Vue学习过程中踩坑记录

一&#xff0c;自闭合的<script>标签 第一次使用Vue&#xff0c;按照步骤引入vue.js&#xff0c;创建div&#xff0c;创建Vue对象&#xff0c;但是未达预期效果。 插值表达式{{name}}没被替换为data对象中的属性值。 F12看了下网页源代码&#xff0c;发现创建Vue对象的…

计算机组成原理面试知识点总结1

#ウルトラマンゼット&#xff08;泽塔&#xff09; 1 计算机发展历程 1.1 计算机的硬件发展 电子管时代晶体管时代中小规模集成电路时代超大规模集成点电路时代 元件更新变化&#xff1a; 摩尔定律&#xff1a;18 个月晶体管翻一倍半导体存储器不断发展微处理器不断发展 1.2…

适合学生的护眼台灯哪个牌子最好?学生护眼台灯十大排名名单

适合学生的护眼台灯哪个牌子最好&#xff1f;作为一名当代的学生&#xff0c;经常会出现长时间用眼的情况&#xff0c;但是这种状况是难以改变的&#xff0c;我国的学习教育一直都在“内卷”&#xff0c;学生课业重&#xff0c;每日的夜间学习更是成了孩子的家常便饭&#xff0…

数据结构之字符串的最长公共子序列问题详解与示例(C,C++)

文章目录 1、最长公共子序列定义2、动态规划解法3、状态转移方程初始化构建最长公共子序列 4、C 和 C 实现示例C 语言实现C 语言实现 5、总结 字符串的最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是计算机科学中的一个经典问题&#xff0c;属于动态…

08、Tomcat 部署及优化

8.1 Tomcat概述 8.1.1 Tomcat介绍 自从 JSP 发布之后,推出了各式各样的 JSP 引擎。Apache Group 在完成 GNUJSP1.0的开发以后&#xff0c;开始考虑在 SUN 的 JSWDK 基础上开发一个可以直接提供 Web 服务的 JSP服务器&#xff0c;当然同时也支持 Servlet, 这样 Tomcat 就诞生…

函数(递归)

递归&#xff1a;程序调用自身编程技巧称为递归。 在学习递归前需要粗略的了解一下内存&#xff0c;内存分为三类&#xff0c;分别是栈区、堆区和静态区。对于栈区来说&#xff0c;每调用一次函数都会为本次函数开辟一块空间&#xff0c;然而栈区也是有空间限制的&#xff0c;随…

GCN知识总结

关键点&#xff1a; 1.理解图结构的形式 2.如何使用邻接矩阵实现其图结构形式 3.GCN卷积是如何实现节点特征更新的 核心公式&#xff1a; 特征提取&#xff1a; 处理好的x 代表节点特征&#xff0c;然后*权重&#xff0c;再*邻接。 A尖换元后&#xff1a; forward函数 传播规则…