垃圾收集算法

1、标记清理算法:效率不高(标记和清理过程效率都不高)、会形成内存碎片

2、复制算法:把内存分为两部分,当进行回收时,把使用部分的存活对象复制到未使用部分,然后两部分内存角色互换(一个为使用的内存,一个为未使用内存。),复制算法一般结合分代收集算法使用。在新生代中使用复制算法进行垃圾收集,内存块按Eden和两个survivor区8:1:1进行分配。当存活对象较多时,效率变低,当存活对象大于%10时需要进行分配担保。当分配担保失败时使用标记清理或标记整理算法进行全部的回收。
3、标记整理算法:标记整理算法,标记部分和标记清理算法相同,整理即将存活的对象向前移动,不会产生内存碎片。
4、分代收集算法:分为新生代和老年代进行垃圾收集,新生代中的对象一般存活的时间短,当对象存活时间较长时移动到老年代中进行保存。
垃圾收集器

(新生代收集器、老年代收集器)
  1. serial收集器:单线程新生代收集器--复制算法
  2. parNew收集器:多线程并行新生代收集器--复制算法
  3. parallel scavenge收集器:多线程新生代收集器,主要目的是可以调节 cpu的吞吐量。
  4. CMS收集器:老年代收集器,需要配合serial或parNew收集器使用,是基于“标记-清除”算法实现的
  5. serial old收集器:老年代单线程收集器,基于“标记—整理”实现。
  6. parallel old收集器:老年代多线程并行收集器“标记-整理”算法实现。
  7. G1(garbage first:优先收集大区域的垃圾):最新的垃圾收集器,是面向服务端应用的垃圾收集器,可以实现低的中断收集,不需要其他收集器的配合就可以独立的完成整个GC堆,基于“标记-整理”和“复制”算法

复制算法:(Eden和survivor的图解)
当新的对象到来首先看此对象的大小是否达到了参数(-XX:MaxTenuringThreadhold)的设置数,大于直接分配到老年代,小于的话再到新生代的Eden中查看是否有足够空间来保存对象,没有触发minor GC
测试代码:
package com.rhq.test;
publicclassTestAllocation{
privatestaticfinalint _1MB=1024*1024;
/**
* 测试jvm对对象的分配策略
* JVM运行的参数:java堆内存的分配参数设置:-Xms20M(堆大小最小20M) -Xmx20M(堆大小最大20M)
* -Xmn10M(新生代大小10M) -XX:+PrintGCDetails -XX:SurvivorRatio=8(Eden和survivor的所占比例为8:1)
* 即Eden:8M survivor:1M(两个survivor)
*/
publicstaticvoid main(String[] args){
// TODO Auto-generated method stub
byte[] a1,a2,a3,a4;
a1=newbyte[2*_1MB];
a2=newbyte[2*_1MB];
a3=newbyte[2*_1MB];
a4=newbyte[3*_1MB];
}
}

  

运行结果:
[GC [PSYoungGen: 6816K->568K(9216K)] 6816K->6712K(19456K), 0.0038864 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC [PSYoungGen: 568K->0K(9216K)] [ParOldGen: 6144K->6620K(10240K)] 6712K->6620K(19456K) [PSPermGen: 2515K->2513K(21248K)], 0.0050892 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
Heap
 PSYoungGen      total 9216K, used 3563K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
  eden space 8192K, 43% used [0x00000000ff600000,0x00000000ff97af60,0x00000000ffe00000)
  from space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
  to   space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
 ParOldGen       total 10240K, used 6620K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  object space 10240K, 64% used [0x00000000fec00000,0x00000000ff277208,0x00000000ff600000)
 PSPermGen       total 21248K, used 2524K [0x00000000f9a00000, 0x00000000faec0000, 0x00000000fec00000)

object space 21248K, 11% used [0x00000000f9a00000,0x00000000f9c77190,0x00000000faec0000)

 

java 内存管理机制的更多相关文章

  1. 你必须了解的java内存管理机制(二)-内存分配

    前言 在上一篇文章中,我们花了较大的篇幅去介绍了JVM的运行时数据区,并且重点介绍了栈区的结构及作用,相关内容请猛戳!在本文中,我们将主要介绍对象的创建过程及在堆中的分配方式. 相关链接(注:文章讲解 ...

  2. 你必须了解的java内存管理机制(一)-运行时数据区

    前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了四遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from 你必须了解的java内存 ...

  3. 你必须了解的java内存管理机制(三)-垃圾标记

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...

  4. 你必须了解的java内存管理机制(四)-垃圾回收

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...

  5. java内存管理机制

    JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...

  6. 浅析java内存管理机制

    内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...

  7. java内存管理机制剖析(一)

    最近利用工作之余学习研究了一下java的内存管理机制,在这里记录总结一下. 1-1.java内存区域 当java程序运行时,java虚拟机会将内存划分为若干个不同的数据区域,这些内存区域创建和销毁的时 ...

  8. Java 内存管理

    java 内存管理机制 JAVA 内存管理总结 java 是如何管理内存的 Java 的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字 new 为 ...

  9. Java内存管理笔记

    java内存管理机制 在java中,内存管理由JVM完全负责,java中的"垃圾回收器"负责自动回收无用对象占据的内存资源,这样可以大大减少程序猿在内存管理上花费的时间,可以更集中 ...

随机推荐

  1. ActiveX控件打包成Cab置于网页中自动下载安装

    [背景] http://www.360doc.com/content/13/1120/20/10159093_330853247.shtml 做过ActiveX控件的朋友都知道,要想把自己做的Acti ...

  2. MySQL 下优化SQL语句的一些经验

    http://java-guru.iteye.com/blog/143377

  3. ffmpeg 内存池

    ffmpeg 部分内存管理采用 了内存池技术.基本的接口在libavutil目录下的buffer.c文件中实现: 1. av_buffer_pool_init 初始化 内存池 2 av_buffer_ ...

  4. Allegro基本操作——PCB布线

    转:http://blog.sina.com.cn/s/blog_1538bc9470102vyyq.html http://www.elecfans.com/article/80/110/2010/ ...

  5. (9)launcher3 之 外部 更换主题Theme APP demo 实现原理以及demo

    先说下我的思路: luancher3里面更换图标的逻辑例如以下: 先从APP资源包里查询--数据库查询--其它地方查询ICON 因此,我们仅仅须要把 从数据库获取ICON 代码提前到  从APP资源包 ...

  6. python--函数嵌套 命名空间

    函数的嵌套调用 def func(): print(123) def func2(): func() print(345) func2() #结果:123 345 函数的嵌套定义 def func() ...

  7. D3js-API介绍【英】

    Everything in D3 is scoped under the d3 namespace. D3 uses semantic versioning. You can find the cur ...

  8. Fedora21 安装视频播放解码器

    12 12月 2014年12月12日 Posted by 涛儿 2 首先启用RPM Fusion软件源: sudo rpm -ivh http://download1.rpmfusion.org/fr ...

  9. Spring Boot外部化配置实战解析

    一.流程分析 1.1 入口程序 在 SpringApplication#run(String... args) 方法中,外部化配置关键流程分为以下四步 public ConfigurableAppli ...

  10. Android自动折行TextView Group

    package com.test.testview; import java.util.ArrayList; import android.content.Context; import androi ...