文档章节

3.深入jvm内核-原理、诊断与优化-4. GC算法和种类

hexiaoming123
 hexiaoming123
发布于 09/22 22:57
字数 1068
阅读 9
收藏 0

一、GC算法和种类

  1. GC的概念

     GC算法
     引用计数法
     标记清除
     标记压缩
     复制算法
     可触及性
     Stop-The-World
     GC的对象是堆空间和永久区
    
  2. 引用计数法

     老牌垃圾回收算法
     通过引用计算来回收垃圾
     使用者
     COM
     ActionScript3
     Python
    

  3. 标记-清除

     标记-清除算法是现代垃圾回收算法的思想基础。
     标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。
     一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。
     然后,在清除阶段,清除所有未被标记的对象。
    

  4. 标记-压缩

     标记-压缩算法适合用于存活对象较多的场合,如老年代。
     它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。
     但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。
    

  5. 复制算法

     与标记-清除算法相比,复制算法是一种相对高效的回收方法
     不适用于存活对象较多的场合 如老年代
     将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收
    

  6. 分代思想

     依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。
     根据不同代的特点,选取合适的收集算法
     少量对象存活,适合复制算法
     大量对象存活,适合标记清理或者标记压缩
    
  7. gc算法总结

  8. 可触及性

     可触及的
     从根节点可以触及到这个对象
     可复活的
     一旦所有引用被释放,就是可复活状态
     因为在finalize()中可能复活该对象
     不可触及的
     在finalize()后,可能会进入不可触及状态
     不可触及的对象不可能复活
     可以回收
    
    	public class CanReliveObj {
    		public static CanReliveObj obj;
    		@Override
    		protected void finalize() throws Throwable {
    			super.finalize();
    			System.out.println("CanReliveObj finalize called");
    			obj=this;
    		}
    		@Override
    		public String toString(){
    			return "I am CanReliveObj";
    		}
    
    	public static void main(String[] args) throws
    		 InterruptedException{
    	obj=new CanReliveObj();
    	obj=null;   //可复活
    	System.gc();
    	Thread.sleep(1000);
    	if(obj==null){
    		System.out.println("obj 是 null");
    	}else{
    		System.out.println("obj 可用");
    	}
    	System.out.println("第二次gc");
    	obj=null;    //不可复活
    	System.gc();
    	Thread.sleep(1000);
    	if(obj==null){
    	System.out.println("obj 是 null");
    	}else{
    	System.out.println("obj 可用");
    	}
    	}
    	}
    

     经验:避免使用finalize(),操作不慎可能导致错误。
     优先级低,何时被调用, 不确定
     何时发生GC不确定
     可以使用try-catch-finally来替代它
    
  9.  栈中引用的对象
     方法区中静态成员或者常量引用的对象(全局对象)
     JNI方法栈中引用对象
    
  10. Stop-The-World

     Java中一种全局暂停的现象
     全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互
     多半由于GC引起
     Dump线程
     死锁检查
     堆Dump
    

  11. 每秒打印10条(这个是jdk6的,jdk8的gc回收停顿没有这么长,知道原理后续在分析)

    	public static class PrintThread extends Thread{
    		public final long starttime=System.currentTimeMillis();
    		@Override
    		public void run(){
    			try{
    				while(true){
    					long t=System.currentTimeMillis()-starttime;
    					System.out.println("time:"+t);
    					Thread.sleep(100);
    				}
    			}catch(Exception e){
    
    			}
    		}
    	}
    
    	public class MyThread extends Thread{
    		HashMap<Long,byte[]> map=new HashMap<Long,byte[]>();
    		@Override
    		public void run(){
    			try{
    				while(true){
    					if(map.size()*512/1024/1024>=450){
    						System.out.println(“=====准备清理=====:"+map.size());
    						map.clear();
    					}
    
    					for(int i=0;i<1024;i++){
    						map.put(System.nanoTime(), new byte[512]);
    					}
    					Thread.sleep(1);
    				}
    			}catch(Exception e){
    				e.printStackTrace();
    			}
    		}
    	}
    

© 著作权归作者所有

hexiaoming123

hexiaoming123

粉丝 5
博文 77
码字总数 69347
作品 0
东城
程序员
私信 提问
深入JVM内核4 GC算法与种类

深入JVM内核 目录 1 GC的概念 Garbage Collection 垃圾收集 1960年 List使用了GC Java中,GC的对象是堆区间和永久区 2 GC算法 2.1引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 使用者...

香沙小熊
2018/12/20
0
0
深入JVM内核2 JVM运行机制

深入JVM内核 目录 1 JVM启动流程 2 JVM基本结构 2.1 PC寄存器 每个线程拥有一个PC寄存器 在线程创建时创建 指向下一条指令的地址 执行本地方法时,PC的值为undefined 2.2 方法区 保存装载的类...

香沙小熊
2018/12/20
0
0
面试官问我:平常如何对你的Java程序进行调优?

作者:张俊城, 郭理勇, 刘建 来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其...

别打我会飞
07/17
228
0
深入JVM内核3 常用JVM配置参数

深入JVM内核 目录 Trace跟踪参数 -verbose:gc -XX:+printGC 可以打印GC的简要信息 -XX:+PrintGCDetails 打印GC详细信息 -XX:+PrintGCTimeStamps 打印CG发生的时间戳 例 -XX:+PrintGCDetails的...

香沙小熊
2018/12/20
0
0
JVM系列篇:JVM性能调优的6大步骤,及关键调优参数详解

本系列会持续更新。 一、JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个...

mikechen优知
03/26
250
0

没有更多内容

加载失败,请刷新页面

加载更多

移动深度学习:人工智能的深水区

人工智能技术经历6年的快速发展,重新定义了很多行业的用户体验,而这仅是开始。 随着5G商用大规模落地,以及智能手机硬件性能越来越强、AIoT设备的快速普及,基于云-边缘-端算法和算力结构的...

博文视点Bv
16分钟前
2
0
vim 分屏 操作

$vim -On file file2 #大写O垂直分屏打开文件 $vim -on file file2 #小写水平打开 # n 表示分屏数,直接n等于文件个数 如果n小于文件,按顺序打开前面的n个,如果大于,打开空编辑页面 分屏快...

突突突酱
19分钟前
2
0
MySQL/Mariadb设置中文字符集(linux)

编辑/etc/my.cnf,添加以下设置 [mysql]default-character-set=utf8[mysqld]character_set_server=utf8[mysqld.safe]default-character-set=utf8[client]default-chara...

编程老陆
21分钟前
2
0
关于linux常用的挂载命令

挂载:就把一块磁盘(可以是光盘,U盘)绑定到一个空目录下面 一般情况下会挂载到mnt目录下面 挂载光盘(把光盘挂载到/mnt/cdrom这个目录中) mount -t iso9660 /dev/cdrom /mnt/cdrom 退出当前目录...

chenhongjiang
23分钟前
3
0
如何分享brain内容外部共享?几个需要知道的TheBrain问答

TheBrain(点击下载)是一款与众不同的思维导图软件,其所有信息通过一个又一个的节点进行联系,最终形成一个杂而不乱的网状结构。从头开始设计,让您捕获您的想法和信息在一个网络的联想,匹...

mnrssj
23分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部