首页 > 系统相关 >彻底搞懂jvm内存以及jvm垃圾回收机制

彻底搞懂jvm内存以及jvm垃圾回收机制

时间:2024-11-13 17:16:47浏览次数:3  
标签:标记 对象 回收 线程 内存 jvm 搞懂 垃圾

jvm内存划分

jvm内存分为线程私有、线程共享、直接内存

线程私有包括:程序计数器,虚拟机栈,本地方法栈

线程共享包括:堆,方法区

程序计数器:每条线程都要有一个独立的程序计数器,cpu通过这个来决定执行的线程,根据这个取指

虚拟机栈:之前上java棵老师提过一嘴,java的方法是放在栈里面的,这里的栈就是指虚拟机栈,该有就是存放局部变量等等

本地方法栈:用来放一些naive方法,这些方法通常是用c或c++写的,因为有时候java方法效率太低了,就看做特殊的虚拟机栈来处理

方法区(永久代):提一嘴永久代在java8之后变成元数据,而元数据不在虚拟机内存中在本地内存中,方法区用于存储被JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,另外运行时常量池也在这里面

堆:放实例化的对象还有数组,new完的对象就放里面,是javaGC(垃圾清除)机制的重点区域

jvmGC机制

如何确定垃圾?

  • 引用计数法:就是看他的引用有多少,为0即可回收
  • 可达性分析:简单地说就是以这个即将被回收的对象出发,看看有没有其他对象指向,没有就被标记为不可达对象,但是请注意不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。

垃圾回收算法

  1. 标记清理
  2. 复制回收
  3. 标记整理
  4. 分代收集

标记清理

简单的一种,把最垃圾标记起来然后清理掉,缺点是内存碎片化(比如有些对象需要站4格连续的但是你最大只有两格连续的,自然就浪费了)

复制算法

把内存分成两半,平时只用一半,清理时把有用的有序放在另一半,然后清除原来那一半,缺点很明显,空间利用率低

标记整理法

是上面两种结合,看图就懂了

分代收集

不同的区的垃圾回收侧重可能不同,造成效率不同,这个请看下面对堆的垃圾回收分析你就懂了

示例:堆的垃圾回收

上面提到了堆是重点GC的区域,那我们再深挖一下堆的空间结构

首相分为新生代老年代两部分

新生代又分Eden区,surviveFrom和surviveTo区

Eden 区:Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden 区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。

ServivorFrom区:上一次GC 的幸存者,作为这一次GC 的被扫描者。

ServivorTo区:保留了一次MinorGC 过程中的幸存者。

MinorGCMajorGC分别属于新老两个区的垃圾回收机制

MinorGC

主要使用复制算法清理垃圾

  • 首先把Eden和surviveFrom的内容复制到ServicorTo,年龄+1(如果有对象的年龄以及达到了老年的标准,则赋值到老年代区)#注意这句话就体现了分代收集
  • 然后清空Eden和surviveFrom
  • 最后交换surviveFrom和ServivorTo

MajorGC

老年代的对象比较稳定,所以MajorGC 不会频繁执行。在进行MajorGC 前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC 进行垃圾回收腾出空间。

就是纯纯的标记清理法,首先扫描一次所有老年代,标记出存活的对象,然后回收没
有标记的对象。MajorGC 的耗时比较长,因为要扫描再回收,没啥好说的

标签:标记,对象,回收,线程,内存,jvm,搞懂,垃圾
From: https://blog.csdn.net/wdghcfrg/article/details/143746651

相关文章

  • DDCA —— 内存架构和子系统&存储器控制器
    1.内存架构和子系统1.1如何控制访问?访问控制:存储单元的访问是通过访问晶体管(accesstransistors)进行控制的。访问晶体管像开关一样,可以连接或断开存储单元和位线(bitline)的连接。存取控制由字线(wordline)控制。当字线激活时,访问晶体管开启,允许存储单元的数据流入或流出......
  • Linux内存管理,它的价值?面试被问过吗?
    Linux内核的内存管理是操作系统最基础且关键的部分之一。它直接影响系统性能、资源分配的效率和多任务管理的稳定性。掌握Linux内核的内存管理,不仅能够帮助我们理解操作系统如何调度资源,还能优化应用程序的性能。在面试中,内存管理常常是考察系统设计、操作系统基础和调优......
  • 揭秘!Vue3.5响应式重构如何让内存占用减少56%
    前言Vue3.5版本又将响应式给重构了,重构后的响应式系统主要有两部分组成:双向链表和版本计数。我们在前两篇文章中我们已经讲过了双向链表和版本计数,这篇文章我们来讲讲为什么这次重构能够让内存占用减少56%。欧阳年底也要毕业了,加入欧阳的面试交流群(分享内推信息)、高质量vue......
  • DDCA —— 大缓存、虚拟内存:多核缓存、NUCA缓存、页表等
    1.缓存中的多核问题1.1多核系统中的缓存IntelMontecito缓存两个core,每个都有一个私有的12MB的L3缓存和一个1MB的L2缓存,图中深蓝色部分均为L3缓存。在多核/多线程系统中,缓存效率变得更加重要存储器带宽非常宝贵缓存空间是各内核/线程的有限资源如何设计多......
  • Goffloader:内存执行,无需磁盘
    免责声明该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。安全公司Praetorian发布了GoffLoader,这是一种旨在简化BOF文件和非托管CobaltStrikePE文件直接在内存中执行的工具,而......
  • 【划重点】一文搞懂Webpack环境区分配置(12)
    在实际开发中,我们经常需要针对生产环境和开发环境分别书写webpack配置。为了更好地适应这种需求,webpack允许配置不仅可以是一个对象,还可以是一个函数。这样,开发者可以根据不同的环境返回不同的配置对象。1.使用函数作为配置module.exports=env=>{return{......
  • C++内存泄漏检查工具——Valgrind(--tool = memcheck)
    在写c++程序中通常遇到程序崩溃,我们首先想到的是内存问题如果代码量少看几遍就能看得出来,如果代码量多起来我们就得借助一些工具了比如gdb调试和valgrind中得memcheck来解决内存问题我用的ubuntu,先安装valgrindsudoapt  updatesudoaptinstallvalgrindvalgrind--ve......
  • C~动态内存函数介绍
    前面咱们与小伙伴们分享了C~库函数的相关知识,今天咱们再介绍一下动态内存函数~一.什么是动态内存函数动态内存函数是指在C语言中用于在程序运行时动态分配和释放内存的一系列标准库函数。这些函数定义在<stdlib.h>头文件中,主要包括malloc、calloc、realloc和free,它们......
  • 《JVM第9课》垃圾回收器
    先来看一张图,串行代表两个垃圾回收器按顺序执行,并行代表同时执行。STW代表工作线程暂停,StopTheWorld的意思。垃圾回收器执行顺序执行方式作用区域使用算法说明SerialGC串行工作线程暂停,单线程进行垃圾回收新生代复制算法SerialOldGC串行工作线程暂停......
  • 权限系统:一文搞懂功能权限、数据权限
    权限系统:一文搞懂功能权限、数据权限大家好,我是汤师爷~在权限系统中,权限通常分为两大类:功能权限和数据权限。这两种权限相辅相成,共同决定了用户在系统中可以执行哪些操作、访问哪些信息。功能权限1、功能权限是什么当登录某个系统时,为什么有些功能按钮是灰色的,而有些页面......