当前位置: 首页 > news >正文

JVM-GC-什么是垃圾

JVM-GC-什么是垃圾

前言

所谓垃圾其实是指,内存中没用的数据;没有任何引用指向这块内存,或者没有任何指针指向这块内存。没有的数据应该被清除,垃圾的处理其实是内存管理问题。

JVM虽然不直接遵循冯诺依曼计算机体系架构,但极其相似,像是一台小型计算机。

一台计算机运行程序的流程大概是这样的:操作系统先将程序加载(load)至内存中,并产生一个进程;CPU在内存中读取指令集并执行;在CPU执行期间需要用到内存中的数据,因此在CPU执行期间内存是必须的;

JVM是执行时,是通过不停的压栈弹栈执行指令的,如果需要内存中数据的时候是通过将引用地址压栈到内存中来获取内存中数据的。栈空间是线程独享,而堆空间是线程不独享的。栈空间在弹栈后释放,而堆空间不会;因此JVM存在内存管理的问题。

内存管理常见问题

内存泄露与内存溢出

内存泄露是指,内存中的数据没有任何引用或者说没有任何指针指向该空间,即垃圾数据;

内存溢出是指内存空间不够,程序无法运行,当内存泄露过多后就会导致内存溢出;

野指针

野指针是指指针指向位置的数据被其他线程释放了,甚至是被其他线程重新占用,导致指针指向的位置是一个不确定的变量;

不同语言的内存管理

  1. c/c++是通过手动方式管理内存的,如C中的free()函数,C++中的delete函数。极其难管理,很容以出现内存泄露、野指针等问题;
  2. java/Python/Golang等后来是通过垃圾回收器自动回收垃圾,再也不需要程序员来手动管理内存。
  3. 还有一些语言是不需要手动管理内存也不需要GC,如rust,它是通过一个内存空间只能一个引用的方式实现的。

手动管理内存的语言麻烦且容易出问题,但线程全部用来执行业务;而使用GC的语言,不需要考虑内存管理的问题,但是需要消耗线程来处理垃圾,效率低;

寻找垃圾的方式

  1. reference count(引用计数法):即通过记录引用的数量或指针的数量来判断是否为垃圾,但是会出现循环引用,导致内存泄露;
  2. root searching: 根可达寻找,从引用的头开始遍历,没有被遍历到的数据为垃圾,JVM中根的定义:
  3. 线程变量
  4. 静态变量
  5. 常量池变量
  6. JNI指针

清除垃圾的方式

  1. mark-sweep:标记清除,弊端是内存碎片化严重
  2. copying:拷贝清除,只占用一半的内存空间,将没有没清除的数据copy到另外一般内存中。弊端是内存地址发生变化,占用内存
  3. mark-compact:标记压缩,在情况垃圾的同时将内存整理。弊端占用CPU

对象在JVM中是如何进行分配内存的

请添加图片描述

相关文章:

  • 【Python】数据处理:NumPy
  • ELasticSearch数据迁移方案-elasticdump
  • 算法排序之冒泡排序及优化
  • SolarLab - hackthebox
  • 【Android面试八股文】Android中操作多线程的方式有哪些?
  • AtCoder Beginner Contest 358 A~E(F,G更新中...)
  • CSS概述
  • web前端开发哪个城市:探索最佳发展地
  • 数据库面试
  • Docker 基础使用(5)Compose
  • 560. 和为 K 的子数组
  • RoCE网络架构在高性能计算的应用
  • [Golang] go-kit 介绍和使用 (微服务实现工具)
  • 【漏洞复现】飞企互联-FE企业运营管理平台 treeXml.jsp SQL注入漏洞
  • 【每日刷题】Day66
  • 08.Android之View事件问题
  • angular2 简述
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • jdbc就是这么简单
  • Linux Process Manage
  • Python语法速览与机器学习开发环境搭建
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Shadow DOM 内部构造及如何构建独立组件
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue2.0项目引入element-ui
  • 反思总结然后整装待发
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 一个JAVA程序员成长之路分享
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 白色的风信子
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 通过调用文摘列表API获取文摘
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #14vue3生成表单并跳转到外部地址的方式
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (C11) 泛型表达式
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (第30天)二叉树阶段总结
  • (第一天)包装对象、作用域、创建对象
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (数据结构)顺序表的定义
  • (算法二)滑动窗口
  • (未解决)macOS matplotlib 中文是方框
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net framework profiles /.net framework 配置
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET是什么
  • [Android]通过PhoneLookup读取所有电话号码
  • [Angular] 笔记 20:NgContent
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ 3282] Tree 【LCT】
  • [BZOJ 4598][Sdoi2016]模式字符串