Tag Archives | gc

最简单例子图解JVM内存分配和回收

一、简介

JVM采用分代垃圾回收。在JVM的内存空间中把堆空间分为年老代和年轻代。将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象。年轻代中又被分为Eden区(圣经中的伊甸园)、和两个Survivor区。新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区。

jvm-memory-generation

doudou-closet

简单讲,就是生命期短的对象放在一起,将少数生命期长的对象放在一起,分别采用不同的回收策略。生命

期短的对象回收频率比较高,生命期长的对象采用比较低回收频率,生命期短的对象被尝试回收几次发现还存活,则被移到另外一个地方去存起来。就像现在夏天了,勤劳的doumadoudoudouba常穿的衣服放在顺手的地方,把冬天的衣服打包放在柜子

另一个地方。虽然把doudo[......]

阅读全文

Tags: , ,

Comments { 3 }

读书笔记《深入理解Java虚拟机》: 垃圾收集器与内存分配策略

  1. 当需要排查各种内存溢出、内存泄露问题时,或者发现gc成为并发瓶颈时,需要对哪些号称“自动化”的内存分配与回收技术进行监控和调节
  2. 程序计算器、虚拟机栈、本地方法栈3个区域随现场而生存、灭亡;栈中的栈帧随着方法的进入和退出而有条不紊的执行出栈和入栈操作,每个栈帧分配多说内存基本上在类结构确定下来时就是已知,这几个区域内存分配和回收是确定的。
  3. 主流的java虚拟机不采用引用计数算法,最主要原因是很难结局对象之间的相互循环引用问题。
  4. 可达性分析算法的基本原理是通过一系列称为GC roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链reference? chain,当一个对象到GC roots没有任何引用链路时。证明该对象是不可用的。
  5. GC? roots包括如下几种:
  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的[......]

阅读全文

Tags: , ,

Comments { 0 }

java 垃圾回收策略

尝试介绍几种常用的垃圾回收算法,根据年轻代、年老的的特征分别使用不同的收集算法。以及考虑到垃圾收集的吞吐量、暂停时间等采用不同的收集选项。

垃圾回收算法

收集算法主要有引用计数(reference counting)和引用追踪(tracing collector),从名字上不难理解一个就是数对象引用数,没用了则清楚,引用追踪则是产看对象是否从活的“跟对象”(“跟对象”见本文下面介绍)关联出来。收集器从根开始访问每一个活跃的节点,标记它所访问的每一个节点。走过所有引用后,收集就完成了,然后就对堆进行清除(即对堆中的每一个对象进行检查),所有没有标记的对象都作为垃圾回收并返回空闲列表。

根据算法的细节引用追踪又分为标记清除、复制、标记整理三类。

tracing-collector

引用计数(Reference?Counting

比较简单直接。最好理解最容易想到的一种策略。原理是此对象有一个引用,即增加[......]

阅读全文

Tags: ,

Comments { 2 }

Java 分代垃圾回收

JVM内存模型简述

一般会认为JVM的内存模型包括永久区内存(?Permanent?space?)和堆内存(heap?space。当然也有人会提到栈内存(stack?space,栈内存一般都不归在JVM内存模型中,因为栈内存属于线程级别。每个线程都有个独立的栈内存空间。 ?Permanent?space里存放加载的Class类级对象如class本身methodfield等等。heap?space是存运行数据的地方。可以想象Permanent?space占用的空间一般不会太大,虽然垃圾回收也是要做。此处要注重描述的分代垃圾回收指的是对于堆内存的处理。

分代的原因

因为不同的对象生命期不同,对于不同的对象采用不同的机制。在实现上就是把新生成的对象放在一起,其中该回收的回收掉,不能回收的被认为生命期比较长放到另外一个区域。对于不同的区域采用不同的回收手段。总体思路其实很简单,我们生[......]

阅读全文

Tags: ,

Comments { 0 }

SoftReference, WeakReference 和 PhantomReference

一、为什么要有这些**Reference

以前一直没搞明白,java中对象直接本身就是传引用reference,不同于c++的可以指针也可以引用。但java.lang.ref包下面居然还专门定义了几个**Reference:SoftReference, WeakReference 和 PhantomReference。这几个类是干什么用的呢?为什么要专门定义这几种特殊的引用?

作为引用,当然都是指向其被引用的对象。但是不同于一般的引用(和这几种引用对照被称为强引用 Strong reference),定义为这几种类型的引用不防碍 Java 垃圾回收器对它们所指向的对象进行回收。即另个特征:1)保留了引用本身的基本要求,即保持对使用对象的引用;2)可以使 JVM在内存不够用的时候对使用对象进行回收

二、代码关系

这几个类都是定义在包java.lang.ref下面,都是publi[......]

阅读全文

Tags: , ,

Comments { 0 }