JVM对象在堆内存中是否如何分配?
1:指针碰撞:内存规整的情况下
2:空闲列表: 内存不规整的情况下
选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。
因此当使用Serial,ParNew等带有压缩整理过程的收集器时,系统采用的分配算法是指针碰撞。既简单有高效。
当使用CMS这种基于清楚算法的收集器时,理论是就只能采用复杂的空闲列表。
线程分配缓冲区如果从内存分配的角度来看,所有线程共享的java堆可以划分出多个线程私有的分配缓冲区(ThreadLocal Allocation Buffer, TLAB),以提升对象分配时的效率
3:本地线程分配缓冲:对象创建在虚拟机频繁发生,即使仅仅修改一个指指向的位置,在并发的情况下也是线程不安全的,可能正在给A对象分配内存,指针还没有来得及及时修改,对象B又同时使用了原来的指针分配内存的情况。
(1):同步锁定,JVM是采用CAS失败重试来保证操作的原子性
(2):线程隔离,把内存分配的动作按照线程划分在不同的空间中进行,即每个线程在java堆中预先分配一款小内存,成为本地线程分配缓冲。只有本地线程分配缓冲用完了以后,用新的缓冲区区时才需要同步锁定。
JVM如何判断对象可以被回收:
JVM存放着所有的对象,垃圾回收器在堆回收之前,会判断那些对象“”活着“”
引用计数法:
就是为每一个对象添加一个引用计数器,用来统计指向当前对象的引用次数,如果当前对象存在引用的更新,那么就对这个引用计数器进行增加,一旦这个引用计数器变为0,就意味着它可以被回收了。
这种方法需要额外的内存空间来存储引用计数器,但它的原理很简单,判断效率也很高。不过主流的JVM都没有采用这种方式,因为引用计数器在处理一些复杂的循环引用或者相互依赖时,可能会出现一些不再使用但是又无法回收的内存,造成内存泄露的问题。
可达性分析法:
java通过可达性算法分析判断对象是否存活,从这些节点开始,根据引用关系向下搜索,搜索过程走过的路径成为“引用链”。如果某个对象到GC Roots之间没有任何引用链相连(也成为不可达)。就证明此对象是不可能被使用的对象。就会被回收.
那些对象可以作为GC Roots?
1、虚拟机栈中的(针栈中的本地变量表)中引用的对象,列如各个线程中被调用方法堆栈中的局部变量,临时变量等
2、元空间的静态属性引用的对象,常量引用的对象。
JAVA的不同引用方式:(是通过可达性算法来说的,来判断这个GCRoot有没有引用或者指向 这个对象,而这里的引用主要分为下面4个类型)
强引用:是指代码之中普遍存在的引用赋值,即类似“Object object = new Object();”。无论任何情况下,只要强引用关系还存在,垃圾收集器就不会回收掉被引用掉的对象。
弱引用:SoftRerfence()内存充足时不回收,不充足时不回收
软引用:WeakRerfence()不管内存是否充足,只要GC一运行就会回收改信用对象
虚引用:很少用,形同虚设,他的作用就是该信用对象被GC回收时触发一个系统通知
JVM里面垃圾回收针对的是 新生代,老年代。还有元空间。
不会针对方法的针栈进行回收,发放一旦执行了。针栈出栈,里面的局部变量就支持从内存中清理清理掉。
代码里创建的对象一般有两种:
一种短期存活的。迅速使用完就会被回收。
一种长期存活的。需要一直生存在java堆内存中。让后续程序不停的使用。
第一种短期存活的对象,通过新生代的S0和S1被垃圾回收15次后,进入老年代中。
为什么要设置老年代和新生代?(就是分代收集理论)
他是建立在两个分代假说之上。
弱分代假说:绝大多数对象都是朝生夕死的
强分代假说:熬过越多次垃圾收集过程的对象越难以消亡。
新生代和老年代有不同的特点,需要不同的垃圾回收算法。
新生的特点时,创建后很快就会被回收,所以需要一种垃圾回收算法。
老年代的特点时,创建后需要很长时间存活,所以需要另外一种垃圾回收算法。
所以需要两个区域来区分垃圾回收算法。
新生代:如果一个区域的对象都是朝生夕死的。那么就就需要把这些对象集中在一起。每次关注时如何保留少量的存活对象,而不是去标记那些大量将要被回收的对象。就能过以较低的代价回收到较大的空间。
老年代:把长期存活的对象集中在在一起。那么虚拟机就可以较低的频率来回收这个区域。这就同时兼顾了虚拟机 垃圾收集器的时间开销和内存开销。
老年代:
为什么要设置 survior1 和 survior2?
首先为什么要设置eden区。如果没有survivor区的话。Eden区每发生一次minor GC时。就会剩余存活的对象将 送入 老年代。当老年代满了以后就会major GC.从而消耗大量时间。所以此时就需要一个缓冲的地方。当Eden发生minjor GC后,将对应存活的对象送入对应的survior。而在survivor1和survivor2中拉回进行转换,只有到15次后,才会移动到对应的老年代,减少对应的major GC.
第二个问题:为什么设置两个Survival区?因为第一次MinorGC后,Survival就会存在一些存活对象,第二次MinorGC后,Eden区的存活对象会放入Survival区,就会与Survival区之前的对象内存不连续,形成内存碎片,时间一长就会影响性能,因此需要两个Survival区,第一次MinorGC时,Eden区的存活对象转移到fromSurvival区,Eden清空,第二次MinorGC时,将Eden和fromSurvival区中存活对象转移到toSurvival,Eden和fromSurvival清空。fromSurvival和toSurvival交换角色,循环往复15次后,再传向老年代。
Eden区与survivor的比列为什么是 8:1:1
一个eden区是新生代对象出生的地方。
两个survivor区。一个用来保存上次新生代minjor GC后存活下来的对象。两外一个空着。再一次新生代发生minjor后,会将 Eden+survivor中存活的对象都复制到另外一个 survivor中。
据统计证明,90%的对象朝生夕死存活时间极短。每次gc都会回收百分只90的对象。剩下百分之10的空间预留给另外一个survivor区。
讲解常见的垃圾回收算法:
标记-清除算法
分为标记和清楚两个动作。首先统一标记需要回收的对象后,标记完后,然后回收掉被标记的对象。或者也可以返过来,标记存过的对象,回收未被标记的对象。标记的过程就是 属于 垃圾判定的过程。
优点:基于可达性性算法实现,实现简单,后续的收集算法都是通过这种算法实现的
缺陷:
1:执行效率不稳定,如果java堆中有大量的对象,而大部分的对象都是需要回收的。那么此时就需要大量的标记-清除的动作。标记-清除的效率会随着对象的数据递增而降低。
2:标记清除后产生大量的内存碎片,导致程序下一次运行时需要分配一个大的对象而没有足够的连续的内存空间而提前触发一次垃圾回收。
标记-复制算法
核心思想就是“半区复制”。他是将可用内存一分为二,首先使用其中的一块内存,当时使用的一块内存用完后,将使用完内存中的存活对象复制到另外一块内存中。然后再将使用过的内存清空
优点:实现简单,效率高。解决了标记清楚产生的内存碎片问题。
缺点: 1:代价太多,将内存空间一份为二,浪费空间。
2:若存活的对象太多,就会产生大量的复制操作,对应的效率降低。
标记-整理算法
首先这里的标记过程与''标记-清除"的标记过程是一样的。但是后续动作不是直接对可回收对象进行整理,而是对存过的对象都集体移动至内存的一段。
优点:
1:没有划分区域,提高空间利用率
2:没有内存碎片
缺点:
整理的过程中,需要STW,效率变低
分代算法
现在一般虚拟机的垃圾收集器都采用“分代”算法。
根据对象存活周期不同。将对象内存划分为“新生代”和“老年代”。java根据各个年代的不同特点采用不同的垃圾回收算法。
新生代中每次进行垃圾回收都会发现大量的对象死去。只有少量的对象存活。因此采用复制算法。只要付出少量存过对象的复制成本就可以完成收集。
老年代因为存过率极高,采用标记-清理,标记-整理 算法来进行回收
垃圾收集器:
Serial 垃圾收集器:
单线程工作的垃圾收集器。他先工作是必须要暂停其他所有工作的线程。知道他收集结束。就是所谓的STW.
ParNew垃圾收集器:
他是新生代收集器。是serial收集器的多线程版本。大部分都以一样。在单CPU下,ParNew还需要切换线程,性能可能还不如 Serial
Parallel垃圾收集器
他是新生代垃圾收集器,基于复制,多线程并行的收集器(与ParNew类似)。侧重于达到一个可控的吞吐量。虚拟机允许100分钟。收集一分钟。吞吐量为99%。 吞吐量 = 运行用户代码时间/(运行用户代码时间+运行垃圾收集时间)。主要优点就是自适应调节策略。
-XX:+UseAdaptiveSizePolicy 这个参数是默认开启的。就不需要人工手动调节新生代的大小。Eden和Survivor的比列,晋升老年代大小等细节参数。虚拟机会根据当前系统运行情况收集性能监控指标信息,动态调整这些参数提供最合适的停顿时间来获取最大吞吐量,
CMS算法
CMS全程Concurrent Mark Sweep, 是老年代垃圾收集器。它是追求最短回收停顿时间为目标的收集器。互联网B/S结构的服务器端特别适合此收集器。
我们知道垃圾回收会带来Stop the World(stw) 的问题,会导致系统卡死时间过长,很多响应无法处理,所以CMS垃圾回收器采取的是垃圾回收线程和系统工作线程尽量同时执行的模式来处理的。基于 标记-清除 算法
从上面的过程可以看出的是,垃圾回收器需要经过的是 初始标记、并发标记、重新标记、
初始化标记的过程:(STW,标记一下 GC Roots能直接关联到对象,那么这些对象也就是需要存活的对象,速度很快的)。
并发标记的过程: (不会STW,追踪GC Roots的整个链路,从 GC Roots的直接关联对象开始遍历整合对象得到引用链路,这个过程耗时比较长但是不需要停顿用户线程,可以与收集线程一起编发运行)
重新标记(STW,修正并发标记期间,因为用户程序继续运行而导致标记产生变化 的哪一部门对象的标记记录,这个阶段的停顿时间通常比较会比初始化标记阶段稍长一些,但也永远比并发标记的时间段,就是对第二段的被系统程序运行变动过的少数对象进行标记,所以允许速度是很快得到)
并发清除(不会STW,清理删除掉标记阶段判断已经死亡的对象,由于基于清除算法,不需要移动存活对象,这个阶段可以和用户线程并发执行。)
线上Java项目CPU飘到100%怎么排查?
(首先jstack工具就是:Java堆栈工具,用于生成当前虚拟机当前时刻的线程快照)
top
top - H 2266 (拿到这个进程下面的很多线程)
printf '%X' 2287
jstack 2266 > 2266.txt
sz 2266.txt
现场Java 服务器内存飘升怎么回事 ?
jamp:java 内存印象工具
jamp命令用于生成堆转储文件。
-heap : 显示java堆中的详细信息,如何使用那种回收器,参数配置,分代情况
-histo : 显示堆中对象统计信息,包括类,实列数量,合计容量
调优命令有哪些? Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。
jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟 机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jmap,JVM Memory Map命令用于生成heap dump文件
jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内 置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
jstack,用于生成java虚拟机当前时刻的线程快照。
jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数。
相关文章:

JVM对象在堆内存中是否如何分配?
1:指针碰撞:内存规整的情况下 2:空闲列表: 内存不规整的情况下 选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。 因此当使用Serial,ParNew等带有压缩整理过程的收…...

【小白慎入】还在手动撸浏览器?教你一招分分钟自动化操作浏览器(Python进阶)
大家好啊,辣条哥又来猛货了! 小白慎入! 目录 环境安装1 测试样例2 基本配置2.0 基本参数2.1 设置窗口2.2 添加头部2.3 网页截图2.4 伪装浏览器 绕过检测2.5案例演示 触发JS2.6 boss直聘cookie反爬绕过实践2. 7滚动到页面底部 3 进阶使用4 数…...

Unity UGUI的TouchInputModule (触摸输入模块)组件的介绍及使用
Unity UGUI的TouchInputModule (触摸输入模块)组件的介绍及使用 1. 什么是TouchInputModule组件? TouchInputModule是Unity中的一个UGUI组件,用于处理触摸输入事件。它可以让你的游戏在移动设备上实现触摸操作,如点击、滑动、缩放等。 2. …...

SpringMVC启动时非常缓慢,显示一直在部署中,网页也无法访问,,,Artifact is being deployed, please wait...
写了一个基本的SpringMVC程序进行测试,结果启动时一直显示在等待部署完毕,,, but这个地方一直显示转圈圈。。 后来通过url访问时网页一直转圈圈。。也就是等待响应。。 看了一会儿,也不知道哪儿错了,&…...

Docker 镜像操作
Docker镜像操作 我们已经介绍了容器操作,今天来了解下 Docker镜像 以及 镜像操作 。让我们一起开启镜像之旅吧。 Docker镜像 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库…...

linux下有关mysql安装和登录的一些问题记录
1. 输入mysql -u root -p出现报错 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/run/mysqld/mysqld.sock (2) 前提:MySQL可执行文件位于/usr/local/mysql/bin目录中,如果MySQL安装路径不同,需要相应修改命令…...

DS18B20的原理及实例代码(51单片机、STM32单片机)
一、DS18B20介绍 DS18B20数字温度传感器是DALLAS公司生产的单总线器件,用它来组成一个测温系统具有线路简单,体积小,在一根通信线上可以挂很多这样的数字温度传感器,十分方便。 温度传感器种类众多,应用在高精度、高可…...

两种单例模式
1.单例模式分为两种,饿汉模式和懒汉模式.以下是饿汉模式: public class SingleTonHungry {private static SingleTonHungry singleTonHungry new SingleTonHungry();private SingleTonHungry() {}public static SingleTonHungry getInstance() {return singleTonHungry;} }2.…...

List中交集的使用
前言 新增了一个需求,需要将所有药品和对应数量库存的药房查询出来,要求:‘所有药品该药房都要有,并且库存大于购药数量’; 这就得考虑一个问题,有的药房有该药品,有的药房没有该药品…...

TypeScript基础篇 - TS的函数
目录 构造函数表达 泛型和函数 泛型函数 Contextual Typing【上下文映射,上下文类型】 泛型约束 手动指定类型 泛型的使用规范 对比 可选参数 思考:onClick中e的设计 函数重载 修改办法 操作符重载 THIS void【空返回值】 思考为什么这样…...

Vue项目如何生成树形目录结构
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一手。 前言 项目的目录结构清晰、可以帮助我们更快理顺项目的整体构成。在写文档之类的时候也比较方便。生成树形目录的方式有多种,我这里简单介绍其中一种较为简单的实现 过…...

postgresql四种逻辑复制的状态
准备 CreateCheckpoint,或者bgwriter启动时,或者创建logicalreplicationslot时都会调用LogStandbySnapshot 记录一个XLOG_RUNNING_XACTS类型的日志。日志中记录了所有提交的事务的xid(HistoricSnapshot) 启动(SNAPBUILD_BUILDING_SNAPSHOT&…...
梯度下降法和牛顿法
梯度下降法和牛顿法都是优化方法。 梯度下降法 梯度下降法和相关知识可以参考导数、偏导数、梯度、方向导数、梯度下降、二阶导数、二阶方向导数一文。梯度下降法是一种迭代地每次沿着与梯度相反方向前进的不断降低损失函数的优化方法。梯度下降只用到一阶导数的信息…...

elment-ui的侧边栏 开关及窗口联动
<template><div class"asders"><el-aside width"200px"><div class"boxbody"><div>源码外卖</div><el-switch v-model"isCollapse" :active-value"true" :inactive-value"fals…...

【从零开始学习JAVA | 第三十二篇】 异常(下)新手必学!
目录 前言: Exceptions(异常): 异常的两大作用: 异常的处理方式: 1.JVM默认处理 2.自己捕获异常 3.抛出处理 自定义异常: 异常的优点: 总结: 前言: 前…...

onnxruntime (C++/CUDA) 编译安装
一、克隆及编译 git clone --recursive https://github.com/Microsoft/onnxruntime cd onnxruntime/ git checkout v1.8.0如果克隆的时候报错: 执行以下: apt-get install gnutls-bin git config --global http.sslVerify false git config --global h…...

第三篇-Tesla P40+CentOS-7+CUDA 11.7 部署实践
第一篇-ChatGLM-webui-Windows安装部署-CPU版 第二篇-二手工作站配置 第三篇-Tesla P40CentOS-7CUDA 11.7 部署实践 硬件环境 系统:CentOS-7 CPU: 14C28T 显卡:Tesla P40 24G 准备安装 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26 安装依赖 yum clean al…...

Unity游戏源码分享-ARPG游戏Darklight.rar
Unity游戏源码分享-ARPG游戏Darklight.rar 玩法 项目地址:https://download.csdn.net/download/Highning0007/88105464...

类型转换运算符
当我们想要将自定义类的对象转换为目标类型时,我们可以通过重载类型转换运算符(conversion operator)来实现。 以下是一个示例代码,展示了如何在 C 中定义一个自定义类,并重载类型转换运算符将对象转换为目标类型&…...

Kafka 入门到起飞系列 - 消费者组管理、位移管理
消费者组 - Consumer Group 上文我们已经讲过消费者组了,我们知道消费组的存在可以保证一个主题下一个分区的消息只会被组内一个消费者消费,从而避免了消息的重复消费 什么是消费组 - Consumer Group? 消费者组是Kafka 提供的可扩展且具有容…...

SpringBoot——数据层三组件之间的关系
简单介绍 在之前的文章中,我们介绍了一下SpringBoot中内置的几种数据层的解决方案,在数据层由三部分组成,分别是数据库,持久化技术以及数据源,但是我今天写着写着,突然就想不起来这三部分到底是干什么的了…...

LeetCode647.Palindromic-Substrings<回文子串>
题目: 思路: 错误代码:(缺少部分判断) 使用的是寻找回文子串的方法。以一个点为中心向两边扫描。但是有一点小问题。 因为回文子串是分奇偶的,所以需要两种判断方式。 看了下答案后发现我的代码距离答案一…...

React的hooks---useContext
Context 提供了一个无需为每层组件手动添加 props ,就能在组件树间进行数据传递的方法,useContext 用于函数组件中订阅上层 context 的变更,可以获取上层 context 传递的 value prop 值 useContext 接收一个 context 对象(React.…...

【Terraform学习】TerraformCloud入门介绍(快速入门)
TerraformCloud入门介绍 什么是 TerraformCloud? Terraform Cloud是Hashicorp Terraform的SaaS版本。 免费版功能 免费版功能包括版本控制集成、远程计划和实施远程计划和实施、通知及webhook、全http API驱动、状态管理、模拟计划、私有化模块注册器以及全HTTP界…...

linux实现运行java分包部署
1.打好包之后 找到bin文件夹下的 startup.sh文件 2.cd 进入bin文件夹下 3.执行 sh startup.sh 运行命令 4.如果出现此错误 是Windows和Linux的.sh脚本文件格式不同,如果在脚本中有空行,脚本是在Windows下进行编辑之后上传到linux上去执行的话,…...

数据安全之全景图系列——数据分类分级落地实践
1、数据分类分级现状 我们正处于一个数据爆炸式增长的时代,随着产业数字化转型升级的推进,数据已被国家层面纳入生产要素,并且成为企业、社会和国家层面重要的战略资源。数据分类分级管理不仅是加强数据交换共享、提升数据资源价值的前提条件…...

C++实现MySQL数据库连接池
C实现MySQL数据库连接池 涉及技术 MySQL数据库编程、单例模式、STL容器、C11多线程(线程互斥、线程互斥、线程同步通信和unique_lock)、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型。 项目背景 为了提升MySQL数据库(基于C/…...

day4 驱动开发 c语言学习
不利用系统提供的register_chrdev,自己实现字符设备的注册 底层代码 led.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h…...

history命令:显示命令执行时间
1.修改配置文件 vim /etc/profile 添加内容 export HISTTIMEFORMAT"%Y-%m-%d %H:%M:%S " #注意:在末尾的“引号”与“S”之间,加入一位空格,将日期时间和历史命令用空格相隔开来。 你也可以换一种清晰的形式,效果…...

Django接口返回JSON格式数据报文
目录 遇到问题 Django返回json结构报文 不可行方式python json 可行方式JsonResponseQuerySet.values()。 python的两个web框架,flask和django,两者都具有view 模板的章节,但是当前开发一个应用,大部分采用前后端分离的合作方式。…...