垃圾收集算法

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. 每天进步一点点——Linux中的线程局部存储(二)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/26876231     在Linux中另一种更为高效的线程局部存储方法,就是使用keyword ...

  2. HTML5、CSS3等新特性:

    HTML5:1/绘画 canvas 元素;2/用于媒介回放的 video 和 audio 元素;3/本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;4/sessionSt ...

  3. 显示和隐藏Mac隐藏文件的命令

    显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏Mac隐藏文件的命令:defaults writ ...

  4. 【Sprint2 每日Scrum】 第一天(4.22)Sprint2计划会议成果

    Sprint2计划会议成果 从今天起我们就开始正式的Sprint2之旅了,经过上一次Sprint1的冲刺计划和几天的调整,我们已经大致了解了敏捷开发的流程和思想,并将我们的TD学生助手做出了大致的框架 ...

  5. Django-model_form

    ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信 ...

  6. Spring Boot中使用RSocket

    1. 概述 RSocket应用层协议支持 Reactive Streams语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到RSocket用在spring boot中, ...

  7. Mac 怎么打开两个终端

    把光标移到终端上,然后Command+N 启动maven  : mvn tomcat7:run

  8. align="absmiddle" 图片的中间上下对齐

    align=absmiddle表示图像的中间与同一行中最大元素的中间对齐 AbsBottom 图像的下边缘与同一行中最大元素的下边缘对齐.AbsMiddle 图像的中间与同一行中最大元素的中间对齐.B ...

  9. 【BZOJ3162】独钓寒江雪 树同构+DP

    [BZOJ3162]独钓寒江雪 题解:先进行树hash,方法是找重心,如果重心有两个,则新建一个虚点将两个重心连起来,新点即为新树的重心.将重心当做根进行hash,hash函数不能太简单,我的方法是: ...

  10. SAM4E单片机之旅——3、LED闪烁之定时器中断

    让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...