关于垃圾回收机制及比较请参见:http://colobu.com/2015/04/07/minor-gc-vs-major-gc-vs-full-gc/ http://colobu.com/2014/12/16/java-jvm-memory-model-and-garbage-collection-monitoring-tuning/…
1. 使用 System.gc() 可以不管JVM使用的是哪一种垃圾回收的算法,都可以请求 Java的垃圾回收. 在命令行中有一个参数-verbosegc可以查看Java使用的堆内存的情况,它的格式:java -verbosegc classfile class TestGC { public static void main(String[] args) { new TestGC(); System.gc(); System.runFinalization(); } } class TestG…
目录 一.背景 二. 哪些内存需要回收? 1.引用计数算法 2 .可达性分析算法 三. 四种引用状态 1.强引用 2.软引用 3.弱引用 4.虚引用 对象死亡(被回收)前的最后一次挣扎 方法区如何判断是否需要回收 四.垃圾收集算法 1.标记-清除(Mark-Sweep)算法 2.复制(Copying)算法 3.标记-整理(Mark-Compact)算法 4.分代收集算法 五.垃圾收集器 1.Serial收集器 2.ParNew收集器 3.Parallel Scavenge收集器 4.Serial…
前言 不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照后,妈妈再也不担心我优化程序找不到方向了. .Net平台垃圾回收 内存优化 凭空想象这些概念多少会索然无味,下图是我我基于本地的一个程序生成的内存快照,使用jetbrains推出的dotMemory工具生成. 生成内存快照 程序运行时可以通过右上角的Get SnapShot按钮生成内存快照,内存快照…
JVM垃圾回收算法 1.标记清除(Mark-Sweep) 原理: 从根集合节点进行扫描,标记出所有的存活对象,最后扫描整个内存空间并清除没有标记的对象(即死亡对象)适用场合: 存活对象较多的情况下比较高效适用于年老代(即旧生代) 缺点: 标记清除算法带来的一个问题是会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc.   2.复制算法(Copying) 原理: 从根集合节点进行扫描,标记出所有的存活对象,并将这些存活的对象复制到一块儿新的内存…
JVM垃圾回收(GC) 1. 判断对象是否可以被回收 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,但无法解决对象相互循环引用的问题. // 循环引用 Node a=new Node(); Node b=new Node(); a.next=b; b.next=a; 可达性分析:从GC Roots开始向下搜索,搜索所走过的路径称为引用链.当一个对象到GC Roots没有任何引用链时,则证明此对象时不可用的,可以被回收. 为了避…
转自:http://blog.163.com/itjin45@126/blog/static/10510751320144201519454/ 官方手册:http://docs.oracle.com/javase/7/docs/     ---->http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html   java命令的各种选项的说明 参考书籍: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)&…
jvm - 垃圾回收 注意 : 本系列文章为学习系列,部分内容会取自相关书籍或者网络资源,在文章中间和末尾处会有标注 垃圾回收的意义 它使得java程序员不再时时刻刻的关注内存管理方面的工作. 垃圾回收机制会自动的管理jvm内存空间,将那些已经不会被使用到了的"垃圾对象"清理掉",释放出更多的空间给其他对象使用. 何为对象的引用? Java中的垃圾回收一般是在Java堆中进行,因为堆中几乎存放了Java中所有的对象实例 在java中,对引用的概念简述如下(引用强度依次减弱)…
stop-the-world 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生.  一:先回答几个问题: 1:什么是Java堆内存? 堆是在 JVM 启动时创建的,主要用来维护运行时数据,如…
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 几乎不占有内存.用于取下一条执行的指令. 2)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制. 堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成,结构图如下所示: 新生…