jvm系列(二)jvm垃圾收集器与内存分配策略
众所周知,在java语言中,内存分配和回收是由jvm自动管理的。因此内存的分配和回收也是jvm三大功能之一。垃圾收集器(GC)需要完成三件事情:
- 哪些内存需要回收?
- 什么时候进行回收?
- 如何回收?
本篇博客将解答jvm是如何处理以上三个问题的。值得注意的是,java运行时数据区中的程序计数器,虚拟机栈,本地方法栈三个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行进栈和出栈的操作,每一个栈帧分配多少内存基本上是在类结构确定下来的时候就已知的。因此以上三个区域不需要过多考虑回收的问题,因为在线程或者方法结束时,内存自然就跟着回收了。垃圾收集器更加关注堆内存的分配和回收,因为堆中内存的分配和回收都是动态的,是在程序运行时才能确定的。
如何判断对象已死?(哪些对象需要被回收?)
目前有两种方法判断对象是否存活。由于引用计数法无法解决循环引用的问题,因此java虚拟机中使用的是可达性分析法。
- 引用技术法(了解)
给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就加一;当引用失效时,计数器的值减一。任何时刻计数器为0的对象就是不可能再被引用的。
引用计数法的优点:实现简单,判定效率高
缺陷:无法解决循环引用问题 - 可达性分析法
通过一系列的称为“GC Roots”对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链的时候,(用途论的话来说,就是从GC Roots到这个对象不可达的时候)。则证明此对象是不可用的。
可作为GC Roots的对象包括:
虚拟机栈(栈帧中的本地变量表)中所引用的对象。
方法区中静态属性引用的对象
方法区中常量引用的对象
本地方法区中JNI(即一般说的Native方法)所引用的对象
因为以上四种类型都可能持有对堆中对象的引用。因此这四种都可以作为GC Roots
java中的四种引用(以下内容回答对象何时被回收的问题)
我们希望有这样一种对象:当内存空间还足够时,将其保留在内存空间之中,如果内存空间在进行垃圾收集之后还是非常紧张,就抛弃这些对象。因此我们需要扩充java中引用的概念:
强引用:一般引用,类似Object obj = new Object()。只要强引用还存在,就不会回收掉被引用的对象。
软引用:
jvm系列(二)jvm垃圾收集器与内存分配策略的更多相关文章
- JVM系列2:垃圾收集器与内存分配策略
垃圾收集是一个很大话题,本文也只是看了深入理解Java虚拟机总结了下垃圾收集的知识. 首先按照惯例,先上思维导图: 垃圾收集简而言之就是JVM帮我们清理掉内存区域不需要的数据.它主要负责清理堆中实例对 ...
- JVM基础知识2 垃圾收集器与内存分配策略
如何判断堆中的哪些对象可以被回收 主流的程序语言都是使用根搜索算法(GC Roots Tracing)判定对象是否存活 基本思路是:通过一系列名为“GC Roots”的对象作为起点,从这些节点开始向下 ...
- 《深入理解Java虚拟机》之(二、垃圾收集器与内存分配策略)
程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭,这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了,而java堆和方法区 ...
- 深入理解Java虚拟机学习笔记(二)-----垃圾收集器与内存分配策略
写在前面 本节常见面试题: 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断一个常量是废弃常量 如何 ...
- 【JVM学习笔记二】垃圾收集器与内存分配策略
1. 概述 1) GC的历史比Java久远 2) GC需要完成的三件事: | 哪些内存需要回收 | 什么时候回收 | 如何回收 3) Java内存运行时区域各个部分: | Java虚拟机栈.计数器.本 ...
- java虚拟机(二)--垃圾收集器与内存分配策略
1.判断对象是否存活的算法: 1.1.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用他时,计数器+1,当引用失效时,计数器-1,任何时刻计数器为0的对象就是不可能再被引用的,但是他很难解决 ...
- jvm系列 (二) ---垃圾收集器与内存分配策略
垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...
- JVM性能优化系列-(2) 垃圾收集器与内存分配策略
2. 垃圾收集器与内存分配策略 垃圾收集(Garbage Collection, GC)是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如 ...
- java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4)
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项 ...
- JVM学习笔记-第三章-垃圾收集器与内存分配策略
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...
随机推荐
- CodeForces 1408I Bitwise Magic
题意 给定三个整数 \(n,k,c\) 和一个长度为 \(n\) 的序列 \(a\),保证 \(a_i\) 互不相同.可以操作 \(k\) 次,每次随机选择一个 \(a_i\) 变成 \(a_i-1\ ...
- 834. Sum of Distances in Tree —— weekly contest 84
Sum of Distances in Tree An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges a ...
- Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题
背景:公司网站业务在做海外营销网站,为了配合营销工作,前端总要在各种地方添加各种社媒订阅(摊手.jpg):最近遇到的是在弹窗内展示公司的Youtube账号的订阅按钮. 理想:我想使用的例子是这样的: ...
- vscode搭建c++环境
第一步:下载 Vs Code 点击链接下载Vs Code 下载版本 并安装 https://code.visualstudio.com/ 点击 Download for Windwos 安装时 如 ...
- ubuntu12.04管理文件系统工具
ubuntu12.04管理文件系统工具 以前可以自动管理系统盘和移动硬盘,刚重新安装了UBUNTU12.04LTS之后不行了,原来是这个工具: "PCMANFM" 群星_-_偏偏喜 ...
- Failed connect to mirrors.cloud.aliyuncs.com:80
在yum insatall 安装是报错 Failed connect to mirrors.cloud.aliyuncs.com:80; Connection refused 解决方法: cd /et ...
- redis重点ppt
- python 第二天 之循环与判断
人生苦短我用python------这句话说的一点都没有错,python功能真的是太强大了,最主要的节约时间,节约时间对于一个程序员意味着什么?意味着早睡,意味着更多的时间可以干更多的活.少熬了了多少 ...
- 掉电后osdmap丢失无法启动osd的解决方案
前言 本篇讲述的是一个比较极端的故障的恢复场景,在整个集群全部服务器突然掉电的时候,osd里面的osdmap可能会出现没刷到磁盘上的情况,这个时候osdmap的最新版本为空或者为没有这个文件 还有一种 ...
- day93:flask:
目录 1.HTTP的会话控制 2.Cookie 3.Session 4.请求钩子 5.捕获错误 6.上下文:context 7.Flask-Script 1.HTTP的会话控制 1.什么是会话控制? ...