Java自动内存管理

在讲解内存管理之前,首先需要了解对象和对象引用的区别

对象是类的一个实例,以人这个类为例,Person是我们定义的一个类

public class Person{}

public Person person;

person = new Person();

而new Person()是新建了一个对象,person是对这个对象的引用,它可以指向任意一个对象。

1.1 java运行时区域(什么地方存什么)

程序计数器:可以理解为线程当前执行位置的标记,用途:线程切换。

       栈

>虚拟机栈:每一个方法执行时创建一个栈帧,方法的执行代表着栈帧在在内存区换入换出。这里面存储着方法参数和局部变量,类型为基本数据类型、数组/对             象的引用。

>本地方法栈:作用和VM stacks类似,只不过服务于native方法。图片引自参考2.

      堆:存放对象实例。垃圾回收主要指针对堆的回收策略。

方法区:类信息,常量,静态变量(static 、class),包含常量池

1.2  垃圾回收机制

垃圾回收(Garbage Collection,GC)自动清空堆中不再使用的对象。

如果一个对象没有引用,我们称这个对象不可达,垃圾回收用于释放不可达的对象所占据的内存,这是垃圾回收的基本原则。

垃圾回收分为两个步骤:判断这个对象是否已死(不可达)和清除这个对象。

1.2.1  对象已死吗

> 引用计数。给对象添加一个计数引用器,当为0时,判断对象不可达。缺点:无法解决相互引用的情况。ObjA.instance
= ObjB;ObjB.instance = ObjA;                ObjA和ObjB已经不能访问,但引用计数法无法通知垃圾回收机制。

改进:以栈和static数据为根(root),从根出发,跟随所有的引用,就可以找到所有的可到达对象。也就是说,一个可到达对象,一定被根引用,或者被其他可                到达对象引用。如下图:引自参考2

1.2.2. 垃圾回收策略

    • 标记-清除(mark-sweep)算法:标记谁不可达,然后删除.

缺点:a.效率,两个步骤效率都不高;b,导致产生大量的空间碎片

    • 复制-清除:将内存划等分为两块区域A和B,扫描A,将可达的对象复制到B中,然后将A清空。缺点:代价太大

改进:由于对象绝大部分生命周期较短,将内存按照一定比例(通常8:1:1)划分为A,B,C,将A和B可达的对象存储到C中,将A和B 清空,A和C作为上一步骤         的A和B。

    • 标记-整理,标记过程类似,存活的对象向一端移动。

参考:1,http://jingyan.baidu.com/article/a501d80cf734c3ec630f5e25.html

2,http://www.cnblogs.com/vamei/archive/2013/04/28/3048353.html
重点推荐

3,《深入理解Java虚拟机:JVM高级特性与最佳实践》.pdf

Java基础--Java内存管理与垃圾回收的更多相关文章

  1. Java进阶之内存管理与垃圾回收

    Java是在JVM所虚拟出的内存环境中运行的.内存分为栈(stack)和堆(heap)两部分.我们将分别考察这两个区域. 栈 在Java中,JVM中的栈记录了线程的方法调用.每个线程拥有一个栈.在某个 ...

  2. 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)

    使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...

  3. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  4. Java内存管理和垃圾回收

    笔记,深入理解java虚拟机 Java运行时内存区域 程序计数器,线程独占,当前线程所执行的字节码的行号指示器,每个线程需要记录下执行到哪儿了,下次调度的时候可以继续执行,这个区是唯一不会发生oom的 ...

  5. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  6. java Vamei快速教程22 内存管理和垃圾回收

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 整个教程中已经不时的出现一些内存管理和垃圾回收的相关知识.这里进行一个小小的总结. ...

  7. Java内存管理及垃圾回收总结

    概述 Java和C++的一个很重要的差别在于对内存的管理.Java的自己主动内存管理及垃圾回收技术使得Java程序猿不须要释放废弃对象的内存.从而简化了编程的过程.同一时候也避免了因程序猿的疏漏而导致 ...

  8. .NET基础 (05)内存管理和垃圾回收

    内存管理和垃圾回收1 简述.NET中堆栈和堆的特点和差异2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存3 ...

  9. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  10. JVM内存管理和垃圾回收机制介绍

    http://backend.blog.163.com/blog/static/20229412620128233285220/     内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...

随机推荐

  1. jQuery技术内幕预览版.pdf3

    jQuery.fn.init(selector,context,rootjQuery):构造函数 jQuery.fn.init() 负责解析参数 selector 和 context 的类型,并执行相 ...

  2. ReadingNotes@02-12-2013

    ReadingNotes@02-12-2013 */--> pre { background-color: #2f4f4f;line-height: 1.6; FONT: 10.5pt Cons ...

  3. noip2011 公交观光

    描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景 ...

  4. Java从服务器上获取时间,动态在jsp页面显示

    Java获取服务器时间,动态显示到jsp页面,大家都是到Java只能获取一次,到页面的时间是静态的,不过通过js和Java的合作,巧妙地实现此功能 本人是给电视做系统,客户要求页面能显示时间,因为电视 ...

  5. idea静态数据加载失败的解决办法

     把上图中的resource文件夹(存放xml等配置文件)标记成resource.

  6. 运用HBuilder上传到GitHub

    Hbuilder安装github插件 如图所示: 一.打开自己GitHub,新建一个"库" 2.设置自己项目名和简介 3.建完后,就会显示GitHub要上传路径 4.打开" ...

  7. PAT 1080. Graduate Admission (30)

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  8. 一个免费的自动化跨平台测试JavaScript的工具——BrowserSwarm

    BrowserSwarm是一个免费工具,能够自动化跨平台测试JavaScript.

  9. Linux 性能优化之 IO 子系统 系列 图

    http://blog.sina.com.cn/s/articlelist_1029388674_11_1.html Linux 性能优化之 IO 子系统(一) 本文介绍了对 Linux IO 子系统 ...

  10. trace openjdk from systemtap

    here are several different tactics to trace openjdk from systemtap. The first relies on sys/sdt.h dt ...