搬以前写的博客【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. RecyclerView跳转到指定位置的三种方式

    自从android5.0推出RecyclerView以后,RecyclerView越来越受广大程序员的热爱了!大家都知道RecyclerView的出现目的是为了替代listview和ScrollVie ...

  2. R2CNN论文思路记录

    Rotational region cnn 我们的目标是检测任意方向的场景文本,与RRPN类似,我们的网络也基于FasterR-CNN ,但我们采用不同的策略,而不是产生倾斜角度建议. 我们认为RPN ...

  3. PHP如何使用AES加密和解密

    AES加密在php5的版本中使用的mcrypt_decrypt 函数,该函数已经在php7.1后弃用了,取而代之的是openssl的openssl_encrypt和openssl_decrypt,并且 ...

  4. JRE和JVM的区别

    JRE和JVM的区别       JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台.所有的Java程序都要在JRE下才能运行.JDK的工具也是Java程序, ...

  5. 【dart学习】之运算符重载

    一,什么是运算符重载(operator overloading) 在软件开发过程中,运算符重载(英语:operator overloading)是多态的一种.运算符重载通常只是一种语法糖,这种语法对语 ...

  6. 【Flutter学习】事件处理与通知之通知(Notification)

    一,概述 Notification是Flutter中一个重要的机制,在Widget树中,每一个节点都可以分发通知,通知会沿着当前节点(context)向上传递,所有父节点都可以通过Notificati ...

  7. C#将数据导入到Excel表格中

    public static DataTable GetExcelToDataTableBySheet(string FileFullPath, string SheetName){           ...

  8. CDN技术之-介绍

    “第一公里”是指万维网流量向用户传送的第一个出口,是网站服务器接入互联网的链路所能提供的带宽.这个带宽决定了一个网站能为用户提供的访问速度和并发访问量.如果业务繁忙,用户的访问数越多,拥塞越严重,网站 ...

  9. HTML中多媒体标签技术说明

    在纯文本的HTML页面中加入图片,给原来单调乏味的页面添加生气.HTML语言中利用<IMG>标记插入图片. 1.图片标记<IMG>及其属性 在网站上,网页设计者都使用了大量精心 ...

  10. 腾讯云ubuntu16.04安装MySql5.7未提示密码设置且无法登陆解决

    一.安装 sudo apt-get update sudo apt install mysql-server 二.修改密码 1.由于安装过程中未提示要设置密码,且使用sudo mysql_secure ...