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

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中内存泄露及垃圾回收机制.pdf

    ### Java中内存泄露及垃圾回收机制 #### 一、内存泄露概述 在计算机科学领域,内存泄露是指在程序运行过程中,不再使用的内存未被及时释放,导致这部分内存无法被重复利用,进而影响程序性能甚至导致程序崩溃的...

    Java的垃圾回收机制详解和调优大全

    垃圾回收机制有多种实现,例如: 1. 标记-清除收集器:标记所有存活对象,然后清除未标记对象,可能产生内存碎片。 2. 标记-压缩收集器:在标记后,将存活对象复制到内存的一端,消除碎片。 3. 复制收集器:将堆分为...

    单例模式与垃圾回收机制

    然而,在实际应用中,人们往往会关心这样一个问题:当单例对象长时间未被使用时,它是否会被Java虚拟机(JVM)的垃圾回收机制回收?本文将深入探讨这一问题,并基于HotSpot虚拟机的特性来分析答案。 #### 二、单例...

    Java应用的垃圾回收优化

    总之,Java应用的垃圾回收优化是一个涉及多方面考虑的过程,包括选择适当的垃圾回收器、定义性能指标、深入理解GC机制、监测和调整参数,以及考虑操作系统级别的优化。对于任何追求高性能和低延迟的Java应用来说,这...

    高吞吐低延迟Java应用的垃圾回收优化.docx

    Java 应用垃圾回收优化 垃圾回收优化是 Java 应用的关键性能指标之一。对高吞吐低延迟 Java 应用的垃圾回收优化是确保用户体验的重要一步。LinkedIn 的高吞吐量服务需要低延迟地响应用户请求,动态信息数据平台作为...

    Java垃圾回收机制的finalize方法实例分析

    Java垃圾回收机制的finalize方法实例分析 Java垃圾回收机制的finalize方法是垃圾回收机制中一个非常重要的概念,它可以帮助开发者更好地理解和掌握垃圾回收机制的工作机理。本文将通过实例形式分析finalize方法的...

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

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

    java虚拟机(jvm)介绍以及相关参数设置与调优

    在本文中,我们将深入探讨Java虚拟机的体系结构、垃圾回收机制、Java对象的生命周期和分代,以及相关的参数设置与调优。 Java虚拟机体系结构 Java虚拟机由三个主要组件组成:类加载器、运行时数据区和执行引擎。类...

    Java垃圾回收(二)老年代垃圾收集器(csdn)————程序.pdf

    Java垃圾回收机制是Java平台中一个非常重要的特性,它的主要任务是自动管理程序运行过程中的内存,自动识别并释放不再使用的对象,以避免内存泄漏。本篇将详细讲解老年代垃圾收集器,主要包括SerialOld、ParallelOld...

    使用java编写的测试类

    它的语法与C++和C#有诸多相似之处,但Java引入了垃圾回收机制,自动处理内存管理,从而减轻了程序员的负担。Java的核心概念包括类、对象、接口、包、异常处理、多线程等。类是对象的蓝图,对象则是类的实例,它们...

    Java Garbage Collection Basics

    # Java垃圾回收基础知识详解 ## 引言 Java 虚拟机 (JVM) 的垃圾回收机制是 Java 语言的一项重要特性,它自动管理内存,帮助开发者减轻了手动管理内存的压力。本篇将深入探讨 Java 垃圾回收的基本原理、工作方式...

    Java groovy内存回收测试步骤解析

    垃圾回收是指 JVM 中的垃圾回收机制,该机制旨在回收不再使用的对象,以释放内存空间。元数据回收是指 JVM 中的元数据回收机制,该机制旨在回收不再使用的元数据,以释放内存空间。 在 Groovy 语言中,元数据回收...

    输出测试java入门程序

    此外,理解Java的垃圾回收机制、JVM的工作原理也能帮助提高编程效率和性能。随着技能的提升,可以尝试使用Java开发更复杂的应用,如数据库应用、Web服务、桌面应用等。 总的来说,"输出测试java入门程序"是一个学习...

    C++ JAVA 软件测试面试题汇总

    - **JVM(Java Virtual Machine)**:Java程序的运行平台,理解垃圾回收机制、类加载器和JVM内存模型对优化Java程序很重要。 - **多线程**:Java提供了丰富的并发工具,如Thread类、Runnable接口、synchronized...

    开发文档&测试帮助文档全集(java/javascript/js/测试帮助文档)

    对于初学者,理解JVM(Java虚拟机)、垃圾回收机制以及异常处理等核心概念至关重要。对于进阶开发者,深入学习Spring框架、多线程编程以及并发控制等内容能提升开发效率。 JavaScript,或者简称为JS,是网页开发中...

    jdk垃圾回收介绍

    Java开发工具包(JDK)中的垃圾回收(Garbage Collection, 简称GC)是Java虚拟机(JVM)管理内存的一种自动化机制。在JDK 7中,G1(Garbage-First)垃圾回收器引入了一种新的内存管理策略,旨在提供可预测的暂停时间...

    Java版剑指Offer全部测试用例

    - 内存管理:了解Java的垃圾回收机制,避免内存泄漏。 - 算法优化:选择合适的数据结构和算法以提高程序运行效率。 9. **异常处理**: - 使用try-catch-finally语句块进行异常捕获和处理。 - 自定义异常,增强...

    JVM中[垃圾回收器]的所有内容-pdf

    2. **ParNew回收器**:ParNew是Serial回收器的多线程版本,主要针对年轻代,适用于多CPU环境,提高垃圾回收的并行性,但仍然使用STW机制。它可以与CMS(Concurrent Mark Sweep)回收器配合使用,作为其新生代部分。 ...

    北大青鸟S1 JAVA 选择题50题内部测试

    8. **内存管理**:了解Java的垃圾回收机制,对象生命周期和引用类型(强引用、软引用、弱引用、虚引用)。 9. **反射机制**:Class类的使用,动态获取类信息,创建对象,调用方法,修改属性等。 10. **泛型**:...

Global site tag (gtag.js) - Google Analytics