搬以前写的博客【2014-12-30 15:07】

以前很少关注内存的问题,基本没有关注,这方面的小白,原因在于自己都是写的自我娱乐的小程序,不关注性能,不是提供服务。而企业级别的应用在程序稳健性方面的要求大大提高,因此要考虑更多的问题。对于大公司来说,为了应对各种情况,服务器资源肯定充足,但是由于应用很多,那么我们要尽可能的节省资源,对于Java程序,内存资源相当宝贵,那么理解java里面怎么做垃圾回收,是很重要的。

我阅读的参考主要是两个内容[1,2],但还没有做具体的实践,也没有切身体会,只能纸上谈兵了。
那么首先要介绍Java里面的内存分配,Java的内存是交由JVM来管理的,大致分为:栈 和 堆 两个部分。
栈,以前在数据结构里学到,是一种先入后出(FILO)的结构,栈里的每一个元素称为一个帧,在Java中,每有一个新的方法被调用,就会在栈里面开辟一段新的空间,里面保存该方法的参数,局部变量、返回地址,引用次数等等。我们知道,参数和局部变量的类型只能是 基本类型 或者 对象的引用。那么栈有一个优点就是,当被调用方法结束时,栈里面的相应帧被删除,这样,方法的参数局部变量也随之清空。
另外一片区域是 堆。堆里面存的是什么?对,是对象,因为对象的大小是动态分配的,栈不能提供这功能,而堆可以。但问题也随之而来,如果一个方法结束时,对象的引用是清空了,但堆里面的对象本身内容不会被清空,只会越积越多,最后程序运行到一定时候,堆内内存溢出。因此,就需要管理堆里面的内存,而Java已经提供了垃圾回收的机制。
什么是垃圾?要回收什么?刚才就看得到,我们要回收的就是那些已经没有引用的对象,这些对象称为 不可达到。很直白,一个对象如果没有应用了,那么他就没有意义了。那么一个很简单的想法,我们为每一个对象保留一个引用计数器,如果计数器为0的时候,就回收该对象内存。这种想法思路正确,但是有两个问题,首先是效率问题,如果一旦有对象没有引用,就立刻回收该对象,那么时间效率会低。 其次如果两个对象相互应用,那么实际上他们是不可达到的,但是不会被回收。
先讨论第二个问题,我们定义 根可达,也就是如果能从栈里的对象引用出发,达到某个对象,那么称它为根可达,我们回收那些不是根可达的对象。
再就是第一个问题,Java的回收机制实际上是混合多种方法的。我们实际写程序时,会发现一个特点,对象回收时,大部分都是新构造不久的对象,那么我们根据这个特点,设计了分代回收机制。将堆内存划分为 年轻代,成熟代,永久代。分代回收机制在不同的区域使用不同的回收策略。
年轻代存放的是新构造不久的对象,采用 copy and sweep。它又分为3个区,伊甸园,from区,to区。伊甸园指的是自从上一次GC之后新构造的对象存放的区域。from区是上一次GC保留下来存活时间不长的对象。to区空白。当伊甸园内存满时,触发一次GC。此时会将from区,伊甸园区中根可达的对象复制到 to区(如果某些对象世间存活很长,会复制到成熟代),并且清空原来的伊甸园,from区。如果 to 区 满了,同样会把一部分复制到成熟代。此时原来的from区变为to区,原来的to区变为from区,交换角色。
成熟代采用的则是 mark and sweep,当成熟代满时,会扫描一次内存,并将根不可达的那些标记下来,并清除。
copy and sweep,mark and sweep的区别在于,一次清除后,前者内存连续,后者不连续。
而永久代则不会用垃圾回收。
至此,大概讲述了java的垃圾回收机制,实际上java的内存远不止堆和栈,但是涉及到垃圾回收的部分大概就是这些。以后再慢慢理解补充。
1. http://www.cnblogs.com/vamei/archive/2013/04/28/3048353.html
2. http://blog.csdn.net/turkeyzhou/article/category/751216

【Java学习笔记】Java的垃圾回收机制的更多相关文章

  1. Java学习笔记-对象与垃圾回收

    Java存在垃圾回收机制,JVM会去回收垃圾,释放资源,而不是像C++一样有程序员去完成 垃圾回收机制的特点 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接.网络IO等资源 ...

  2. Java中内存泄露及垃圾回收机制

    转自:http://blog.sina.com.cn/s/blog_538b279a0100098d.html 写的相当不错滴...................... 摘  要 Java语言中,内 ...

  3. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  4. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  5. [Java] 理解JVM之三:垃圾回收机制

    JVM内存中的各个区域都会回收吗? 首先我们知道 Java 栈和本地方法栈在方法执行完成后对应的栈帧就立刻出栈销毁,两者的回收率可以认为是100%:Java 堆中的对象在没有被引用后,即使用完成后会被 ...

  6. Java基础知识总结之垃圾回收机制

    垃圾回收机制 Java垃圾回收机制是Java语言的重要功能之一.当程序创建对象,数组等引用类型对象时,系统会自动在内存区为之分配一块内存,对象就保存在这块内存区内,当这块内存不再被任何变量引用时,这块 ...

  7. jvm学习笔记一(垃圾回收算法)

    一:垃圾回收机制的原因 java中,当没有对象引用指向原先分配给某个对象的内存时候,该内存就成为了垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息 ...

  8. [java学习笔记]java语言基础概述之内存的划分&堆和栈

    1.内存的划分 1.寄存器 cpu处理 2.本地方法区 和所在系统相关 3.方法区 方法加载进内存,其实就是开辟了一块该方法的方法区 方法区中还可以有静态区,用于存放静态变量(类变量) 4.栈内存 5 ...

  9. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  10. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

随机推荐

  1. perl升级后shutter程序无法运行的修复

    这个问题真的很无语,perl升级后一些依赖perl的aur包不能用了,需要rebuild,这样让系统稳定性何在-- 运行shutter错误信息: $ shutter Can't locate Gnom ...

  2. 网络通信_socket

    socket又称套接字 使用server实现循环通信 代码如下 import socket server = socket.socket() server.bind(()) server.listen ...

  3. Codeforces 1188D Make Equal DP

    题意:给你个序列,你可以给某个数加上2的幂次,问最少多少次可以让所有的数相等. 思路(官方题解):我们先给序列排序,假设bit(c)为c的二进制数中1的个数,假设所有的数最后都成为了x, 显然x &g ...

  4. 程序猿必备的10款web前端动画插件

    1.基于jQuery的瀑布流图片筛选插件 瀑布流的展现方式在目前的网页中用得越来越广泛,特别是图片和首页文章的动态加载. 今天分享的这款就是基于jQuery的瀑布流图片筛选插件,我们可以点击图片分类名 ...

  5. C语言之——__attribute__

    __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关 . __ ...

  6. Jquery中的offset()和position()深入剖析(元素定位)

    先看看这两个方法的定义. offset(): 获取匹配元素在当前视口的相对偏移. 返回的对象包含两个整形属性:top 和 left.此方法只对可见元素有效. position(): 获取匹配元素相对父 ...

  7. Ceph介绍及原理架构分享

    https://www.jianshu.com/p/cc3ece850433 1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能. ...

  8. select into outfile的sql语句

             SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据.但是这种方法只能导出或导入数据的内容,不包括表的结构,如果 ...

  9. 存储-docker volume 生命周期管理(14)

    volume 生命周期管理 - 每天5分钟玩转 Docker 容器技术(44) Data Volume 中存放的是重要的应用数据,如何管理 volume 对应用至关重要.前面我们主要关注的是 volu ...

  10. percona-toolkit工具包的安装和初步使用

    percona-toolkit工具包的安装和初步使用 原文地址:http://blog.csdn.net/yumushui/article/details/42919601 一.percona-too ...