java垃圾回收和堆内存布局

java虚拟机是通过垃圾回收的方式进行内存回收的,C/C++可以通过代码控制内存释放,防止内存泄露,设置不同的垃圾回收方式和参数都会影响垃圾回收的效果,而这对系统的稳定性及单机的支撑能力方面。

jvm指令集里面没有提供垃圾回收的释放操作,所以不能直接释放内存,而要专门的垃圾回收器来完成垃圾回收的工作。

  不同的垃圾回收器产品有不同的回收策略,先来看Oracle Hotspot JVM中内存的对布局,如图3.2

从上图可以看出,有三大区域Young/Tenured/Perm,也就是我们经常说的新生代/老年代/持久代。

  一般来说,新的对象被分配到新生代(Young)的Eden区,也有可能被直接分配到老年代(Perm),在进行新生代垃圾回收的时候,Eden区存活的对象被复制到空的Survior区,而下次新生代垃圾回收的时候,Eden区存活的对象和这个Survivor区中存活的对象被复制到另外一个Survivor区,并且清空当前的Survivor区。经过多次的新生代的垃圾回收,还存活的对象被移到老年代,而老年代也会根据一定时间进行呢垃圾回收。

在Hotspot中,针对新生代提供的GC方式:

串行GC:Serial Copying

并行GC:ParNew

并行回收GC:Parallel Scavenge

针对老年代有下面的GC方式:

串行GC:Serial MSC

并行MS GC:Parallel MSC

并行 GC:Compacting GC - Parallel Compacting

并发GC - CMS

在Sun的Java6 update14中,引入了Garbage First(G1)回收器,G1的目标是取代CMS。

时间: 2024-10-28 10:09:22

java垃圾回收和堆内存布局的相关文章

Java垃圾回收(二) 堆内存的分代回收

堆内存的分代回收 Java针对堆的垃圾回收,将堆分为了三个较小的部分:新生代.老年代.持久代.新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器. 1. 分代回收的依据: 对象生存时间长短:大部分对象在Young期间就被回收. 不同代采用不同的垃圾回收策略:对存活时间不同的对象分类,用不同的垃圾回收算法进行高效的有针对回收. 2. 堆内存的分代: Young代: 回收机制:因为对象数量少,所以采用复

Java垃圾回收机制以及内存泄漏

原文地址 前言 在segmentfault上看到一个问题:java有完善的GC机制,那么在java中是否会出现内存泄漏的问题,以及能否给出一个内存泄漏的案例.本问题视图给出此问题的完整答案. 垃圾回收机制简介 在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据.如果只是不停的分配内存,那么程序迟早面临内存不足的问题.所以在任何语言中,都会有一个内存回收机制来释放过期对象的内存,以保证内存能够被重复利用. 内存回收机制按照实现角色的不同可以分为两种,一种是程序员手动实现内存的释放

Java垃圾回收机制以及内存泄露

1.Java的内存泄露介绍 首先明确一下内存泄露的概念:内存泄露是指程序运行过程动态分配了内存,但是在程序结束的时候这块内存没有被释放,从而导致这块内存不可用,这就是内存 泄露,重启计算机可以解决这个问题,但是有可能再次发生内存泄露,内存泄露与硬件没有关系,它是软件设计的缺陷所导致的. Java发生内存泄露的原因很明确,就是长声明周期对象持有短声明周期对象的引用就很可能发生内存泄露.尽管短生命周期对象已经不再需要,但是因为长生命 周期对象在持有它的引用而导致它不能被GC回收,这就是Java内存泄

Java 垃圾回收(GC) 泛读

Java 垃圾回收(GC) 泛读 文章地址:https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要的疑惑在于这么几点: 为什么需要 GC ? 虚拟机(JVM) 与 垃圾回收(GC) 的关系? GC 的原理有哪些? 哪些 对象容易被 GC ? 等等 带着这些问题往下看: 1. 为什么需要 GC ? GC: 是Garbage Collection 的英文缩略,垃圾收集的意思. 为什么需要 GC?主要

垃圾回收机制与内存分配策略

我们经常说的垃圾收集(Grabage Collection,GC)需要确定以下三个事情: 哪些内存需要回收? 什么时候回收? 如何回收? 在这三件事情之前,我们先看看为什么要进行垃圾收集? 因为程序中存在的实例对象,变量等信息如果不进行垃圾回收的话,随着程序的运行,必然会带来程序性能的下降,造成卡.慢甚至系统异常. 哪些内存需要回收? 前面我们说到了程序计数器.虚拟机栈.本地方法栈三个区域是线程隔离的数据区,也就是说,这三个区域随线程而生,随线程而灭.由于这几个内存区域的内存分配和回收具有确定性

java 垃圾回收机制和调优(转)Java Garbage Collection

(转)http://www.cnblogs.com/shudonghe/p/3457990.html 文主要介绍,JVM的组件,自动垃圾收集器是如何工作的,分代垃圾收集器的收集过程,使如何用Visual VM来监视应用的虚拟机,以及JVM中垃圾收集器的种类. 一.JVM架构 1.HotSpot 架构 HotSpot JVM架构支持较强的基本特征和功能,此外还支持高性能和高吞吐率的特性.例如,JVM JIT编译器产生动态优化的代码,亦即,编译器是在Java运行的时候的时候进行优化,并为当然的系统架

Java 垃圾回收机制(早期版本)

Java 垃圾回收机制在我们普通理解来看,应该视为一种低优先级的后台进程来实现的,其实早期版本的Java虚拟机并非以这种方式实现的. 先从一种很简单的垃圾回收方式开始. 引用计数 引用计数是一种简单但是速度很慢的垃圾回收技术. 每个对象都含有要给引用计数器,当有引用连接至对象时,引用计数+1. 当引用离开作用域或者被置为null时,引用计数-1. 当发现某个对象的引用计数为0时,就释放其占用的空间.   这种方法开销在整个程序生命周期中持续发生,并且该方法有个缺陷,如果对象之间存在循环引用,可能

Java垃圾回收机制的工作原理

Java垃圾回收机制的工作原理 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.Java中引入垃圾回收机制的作用 当我们建完类之后,创建对象的同时,进行内存空间的分配,为了防止内存空间爆满,java引入了垃圾回收机制,将不再引用的对象进行回收,释放内存,循环渐进,从而防止内存空间不被爆满. 1.垃圾回收机制的工作原理 创建的对象存储在堆里面,把堆比喻为院子中的土地,把对象比喻为土地的管理者,院子比喻为java虚拟机,当创建一个对象时,java虚拟机将给

Java GC专家系列2:Java 垃圾回收的监控

这是”成为GC专家系列”文章的第二篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.到目前为止,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在本篇中,我将介绍JVM在真实环境中如何运行GC的. 什么是GC监控 GC监控 指的是在运行时跟踪JVM运行GC的过程.例如,通过GC监控,我们能找出: 何时新生代的对象会被移动到老年代,有多少对象被移到了老年代. 何时stop-the-world发生以及持续时间. 通