JVM java垃圾回收机制
一.jvm简介
1.JVM内存运行时数据区的三个重要的地方
1.1.堆(heap):它是最大的一块区域,用于存放对象实例数组,是全局共享的。
1.2.栈(stack):全称为虚拟机栈,主要存储基本数据类型,以及对象的引用,是私有线程
1.3.方法区(Method Area):在class被加载后的一些信息,如常量,静态常量这些被放在这里,在hotspot里我们将它称之为永生代
1.4.pc寄存器(PC Regesiter): 在多线程中,系统需要给每一个线程 分配一个进程编号,这个时候才会需要到寄存器。
年轻代
在年轻代中jvm使用的是Mark-copy算法,就像算法名字说的那样有两个步骤,第一是标记(Mark) 第二是copy(复制),Mark主要用于标记出还活着的实例,然后清除掉没有被标记的实例,释放内存,然后Copy部分则是将还活着的实例根据年龄拷贝到不同的年龄代。
对于标记 与区分年龄代的技术 我们一般都是用到的都是引用计数器,在每一个对象中都含有引用计数器,都有引用指向对象的时候 引用计数器就会加1,不在被引用 计数器 减 1,对与垃圾回收的策略则是标记所有活着的实例,将没有被标记的实例全部回收 释放内存。
对于静态,我们都知道静态方法与静态变量是不会产生实例的,直接通过类的引用,使用 ClassLoader进行加载的类数据如前面所说是不存在逻辑堆里面的,直接存在于永生代里面也就是 方法区里面,这个类一旦被清除掉里面所有的静态变量都会被清除
当我们在 Object obj 的时候 向逻辑堆中的 Eden区域 申请内存,当Eden区域的内存不足的时候,这个时候会触发GC这个时候称gc为小型垃圾回收,每个实例都有一个独有的年龄,每个引用被经历过一次GC后就会年龄加一,同时就会将没有被清理掉的对象全都copy到上图的survivor1区域,如图1所示:
当第二次GC执行的时候就会使用Mark算法找到存活的对象,然后将他们的年龄加1,并且将他们拷贝到survivor2区域,然后执行GC,这样就可以实现survivor1 与 survivor2 两个一样大的区域进行交替使用,当对象的年龄足够大的时候,对象就会被移动到老年代,这里移动到老年代的标准由JVM的参数所决定
年老代 :
当GC被触发的时候 eden的对象会转到 survivor1 然后再次就会转到 survivor2 ,当survivor1的对象太大了 survivor2的区域无法容纳得部分就会转到Tenured的区域,当Tenured的区域也容不下的时候就会自动移动到年老代,在移动年老代的时候会先触发年老代上面的GC然后在将Tenured容纳不下的对象放入年老代。
二.gc简述:
2.JVM的gc概述
gc即垃圾回收机制,其指的是释放那些被废弃掉的,且不再使用的对象所占的内存。java语言不要求jvm有gc,也没有规定如何工作,而且大多数的gc都使用类似的算法管理和执行收集操作。
2.1.引用计数:
当应用程序创建引用或引用超出范围时,jvm必须适当增减引用数,当某对象的引用数为0时,便可以进行垃圾收集。
2.2.对象引用遍历
早期的jvm使用引用计数,现在大多是jvm都采用对象引用遍历。对向引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
下一步,gc要删除不可到达的对象。删除时,有些gc只是简单的扫描堆栈,删除未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多gc可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。
为此,gc需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有gc运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的gc不断增加或同时运行以减少或者清除应用程序的中断。有的gc使用单线程完成这项工作,有的则采用多线程以增加效率。
JVM java垃圾回收机制的更多相关文章
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- 深入理解java垃圾回收机制
深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- Java垃圾回收机制_(转载)
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- 成为Java GC专家(3)—如何优化Java垃圾回收机制
为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或 ...
- java 垃圾回收机制 引用类型
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对 ...
- 【Java】Java垃圾回收机制
Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...
- Java垃圾回收机制以及内存泄露
1.Java的内存泄露介绍 首先明白一下内存泄露的概念:内存泄露是指程序执行过程动态分配了内存,可是在程序结束的时候这块内存没有被释放,从而导致这块内存不可用,这就是内存 泄露,重新启动计算机能够解决 ...
随机推荐
- snopy 数据库简介
snoRNA ,small nucleolar RNA, 核仁小分子RNA, 是一类在细胞核内的small non-coding RNA, 长度在60-300nt, 其主要功能是调控其他小RNA分子( ...
- 多线程开发之二 NSOperation
效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UITableViewControll ...
- 一台PC双网卡,一个外网一个内网
问题:一台PC双网卡,一个连外网一个连内网.用户主要访问外网,内网只访问有限的几个ip.因为外网很大,一般人公司内网常访问的ip是有限的几个. 现在如何做到在上外网的同时也能访问内网的系统?明明两个网 ...
- Java 正则表达式详细使用
Java 正则表达式 java.util.regex.Pattern java.util.regex.Matcher 1.Matchmatch 是从字符串最头部开始匹配,一直到结束,需要匹配整个串 S ...
- element的form表单中如何一行显示多el-form-item标签
效果图: HTML代码: <script src="//unpkg.com/vue/dist/vue.js"></script> <script sr ...
- iOS - 身份证判断正则加算法
身份证常识 我国的身份证号分为15位和18位两种.身份证是国民的身份编号,编号是有一定规律的. 居民身份证号码,根据[中华人民共和国国家标准 GB -]中有关公民身份号码的规定,公民身份号码是特征组合 ...
- python 中面向对象的概念
原文 域和作用空间 本地域,函数域(nonlocal)和 全局域(global) def scope_test(): def do_local(): spam = "local spam&q ...
- Flask web开发之路六
紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...
- TOP100summit:【分享实录-WalmartLabs】利用开源大数据技术构建WMX广告效益分析平台
本篇文章内容来自2016年TOP100summitWalmartLabs实验室广告平台首席工程师.架构师粟迪夫的案例分享. 编辑:Cynthia 粟迪夫:WalmartLabs实验室广告平台首席工程师 ...
- 线段树 || BZOJ 1112: [POI2008]砖块Klo
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1112 题解: 希望有连续K柱的高度是一样的,就先把1~K的数扔进线段树(线段树的下标就是数值 ...