`
aijuans
  • 浏览: 1547734 次
社区版块
存档分类
最新评论

JAVA分代垃圾回收机制测试

阅读更多

ava分代回收测试
测试代码:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package juint.test;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6.   
  7. public class JstatTest  
  8. {  
  9.       
  10.     @SuppressWarnings("static-access")  
  11.     public static void main(String[] args)  
  12.     {  
  13.         Map<String,Object> map=new HashMap<String,Object>();  
  14.         for(int i=0;i<1000000;i++){  
  15.             try  
  16.             {  
  17.                 map.put(String.valueOf(i), new Integer(i));  
  18.                 System.out.println("循环--"+new Integer(i));  
  19.                 Thread.currentThread().sleep(10);//这里可以调整为500,50,10  
  20.             }  
  21.             catch (InterruptedException e)  
  22.             {  
  23.                 e.printStackTrace();  
  24.             }  
  25.         }  
  26.     }  
  27. }  

命令使用
jstat -gcutil 1300 1000 500

 

 

这里补充一下,在此文的基础上,基本多次YGC 对应一次FullGC,注意这里只有两个Survivor区,可以定义多个,数据如下:

 S0          S1      E        O          P     YGC     YGCT    FGC    FGCT     GCT

100.00   0.00  53.40  74.12   3.06     12         0.170     1        0.033    0.202 

这里进行了12的YGC,也就是说在Survivor 复制了12次,FGC进行了一次,每一次YGC都会往Old中存放对象,一下是数据支持:

 S0          S1      E         O          P      YGC     YGCT    FGC    FGCT     GCT

  0.00    0.00   100.00   0.00     3.06      0        0.000     0       0.000       0.000
  0.00   100.00   4.02    5.94     3.06      1        0.013     0       0.000       0.013

最开始s0和s1都没有,在进行一次YGC之后O里面有内容了,实验得知,每一次往S0或者S1复制对象,都会往old里面添加添加存活较久的对象,并且FGC执行,不一定非得Old满了,才会进行,在第一组数据里,FGC就进行了,但O区还只有74.12的数据

查看java虚拟机内存情况,也可以使用这个命令:java -stat

 

以下是原理,感谢  http://jefferent.iteye.com/blog/1123677 这里贴上方便查看,也可以直接复制url上他的博客查看

虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。

  年轻代:

  所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

  年老代:

  在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

  持久代:

  用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。

什么情况下触发垃圾回收:

    由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。

    Scavenge GC

    一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

    Full GC

    对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:

  • 年老代(Tenured)被写满
  • 持久代(Perm)被写满
  • System.gc()被显示调用
  • 上一次GC之后Heap的各域分配策略动态变化

其他精彩文章文章

 

在 android dialog中使用Autocompletetext 
大型网站架构设计-Solr
mysql哈希索引
android学习笔记(32)网格视图(GridView )和图形切换器(ImageSwi...
android学习笔记(31)可展开的列表组件(ExpandableListView )

 

 

 

 

更多关于android开发文章

2
5
分享到:
评论

相关推荐

    Java文件流关闭和垃圾回收机制

    本文是关于Java IO文件流和垃圾回收问题,一个小的测试程序搞清楚Java IO的问题,希望能帮助有需要的小伙伴

    Java面试基础测试题及答案

    4、 Java的核心机制是什么?并介绍其核心机制 1、JVM和GC 2、Jvm:在一台计算机上由软件或者硬件模拟的计算机(读取字节码代码的Cpu)。Java虚拟机(JVM)读取并处理经编译过的平台无关的字节码(class)文件;java...

    大话Java性能优化

    前言 第1章 性能调优策略概述 ...7.3 垃圾回收机制相关 7.4 实用JVM实验 7.5 本章小结 第8章 其他优化建议 8.1 Java现有机制及未来发展 8.2 系统架构优化建议 8.3 与编程无关 8.4 本章小结

    用Java实现的数据结构暨算法,同时对其进行了测试.zip

    健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序...

    用Java实现的数据结构暨算法,同时对其进行测试.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java系统中内存泄漏测试方法的研究

    由于采用垃圾回收机制,Java语言的内存泄漏的模式与C++等语言相比有很大的不同。全文通过与C++中的内存泄漏问题进行对比,讲述了Java内存泄漏的基本原理,以及如何借助Optimizeitprofiler工具来测试内存泄漏和分析...

    2019年Java程序设计教程测试题及答案-测试题一.docx

    垃圾回收器 B .虚拟机 C .编译器 D .多线程机制 答案: B (2)下列叙述中,正确的是( ) A .Java 语言的标识符是区分大小写的 B .源文件名与 public 类名可以不相同 C .源文件扩展名为.jar D .源文件中 ...

    2019最新BAT python面试题

    2019最新BAT python面试题

    java 程序设计 期中考试.doc

    3.Java有垃圾回收机制,内存回收程序可在指定的时间释放内存对象. ( × ) 4.构造函数用于创建类的实例对象,构造函数名应与类名相同,返回类型为void. ( × ) 5.在异常处理中,若try中的代码可能产生多种...

    论文研究-A Tool for Testing Java Memory Leaks.pdf

    一个测试Java内存泄漏的工具,党万春,钱巨,虽然Java语言有自带的垃圾回收机制,Java程序仍然存在由无效引用带来的内存泄漏。而内存泄漏会导致内存耗尽、程序崩溃等严重问题。�

    JAVA基础课程讲义

    垃圾回收机制(Garbage Collection) 63 方法的重载(overload),构造方法的重载 63 this关键字 65 static 关键字 66 静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    AI100文本分类竞赛代码。从传统机器学习到深度学习方法的测试.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    JAVA性能瓶颈和漏洞检测

    垃圾回收分析:检测过多的短期对象和垃圾收集详情; Snapshot 比对:确定代码改变对内存使用的影响。 JProbe Coverage *JProbe Coverage 帮助开发人员查找未执行代码,精确计算已执行代码,简化对测试工作可靠性和...

    毕业设计-分布式软件测试管理系统的设计与实现.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    JAVA面试题最全集

    列举三种以上垃圾回收算法,并比较其优缺点? 39.编写代码实现一个线程池 40.描述一下JVM加载class文件的原理机制? 41.试举例说明一个典型的垃圾回收算法? 42.请用java写二叉树算法,实现添加数据形成二叉树...

    Java编程艺术 PDF

    1.2 通过垃圾回收实现内存管理 3 1.3 完美的简单多线程模型 3 1.4 完全集成的异常机制 4 1.5 对多态性支持的改进 5 1.6 通过字节码保证可移植性和安全性 5 1.7 丰富的Java API 6 1.8 Applet 7 1.9 继续变革 7 第2章 ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 48 3.2.5 回收方法区 / 50 3.3 垃圾收集算法 / 51 3.3.1 标记 -清除算法 / 51 3.3.2 复制算法 / 52 3.3.3 标记-整理算法 / 54 3.3.4 分代收集算法 / 54 3.4 垃圾收集器 / 55 3.4.1 Serial收集器 / 56 ...

Global site tag (gtag.js) - Google Analytics