搬以前写的博客【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. 一次goldengate故障引发的操作系统hang起,HA自动切换

    现场: 跑着数据库的主机A报警应用连接不上数据库,我们无法ssh到主机.第一反应是通过telnet到远程控制口,发现数据库资源和硬件资源在被切换到HA架构的主机B(备机,通常性能比主机A的差,抗不住应 ...

  2. jQuery 实现表格变色效果

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  3. js unshift()

    定义与用法 unshift()方法可像数组添加一个或多个元素 并返回新长度 语法 arrayObject.unshift(newElement1,newElement2,......,newEleme ...

  4. typedef 函数指针的使用(含例子)

    C代码   //#include<iostream.h>   #include<stdio.h>      typedef int (*FP_CALC)(int, int);  ...

  5. SQL Server 管理套件(SSMS)

    SQL Server 管理套件(SSMS) 当您按照之前章节的步骤顺利安装完 SQL Server 2014 后,要做的第一件事就是需要打开 SQL Server 管理套件,并且要知道怎样去使用它. ...

  6. shell脚本编程测试类型上

    一bash的条件测试 判断某需求是否满足,需要由测试机制来实现.专用的测试表达式需要由测试命令辅助完成测试过程. 评估布尔声明,以便用在条件性执行中.若真,则返回0:若假,则返回1. 测试命令:• t ...

  7. 如何在html中添加引用公共模块文件

    1.首先需要修改apache的配置文件: 打开httpd.conf 搜索“AddType text/html .shtml” 搜索结果: AddType text/html .shtml .html ...

  8. kvm无人值守安装centos6

    nginx配置 server { listen default_server; server_name _; root /home/iso; # Load configuration files fo ...

  9. nodejs操作消息队列RabbitMQ

    一. 什么是消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已.其主要用途:不同进程Process/ ...

  10. http中请求协议 GET和POST两种基本请求方法的区别

    GET和POST是什么?HTTP协议中的两种发送请求的方法. HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议. HTTP的底层是TCP/IP.所以GET和POST的底 ...