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. 树中是否存在路径和为 sum leecode java

    https://oj.leetcode.com/problems/path-sum/ /** * Definition for binary tree * public class TreeNode ...

  2. Linux常用命令及vim的使用、vim常用插件(推荐)

    看了3篇文章,很好 vim中的区域拷贝 剪切,粘贴: 正常模式,移动光标到剪切的区域开始处,按v,进入可视模式,然后选择区域.按x键,剪切.到指定位置按p粘贴. 撤销按u 恢复按ctrl-r  简明 ...

  3. Java学习——数据类型【2】

    1. 对象与类 对象:类的一个实例,有状态和行为. 类:一个模板,描述一类对象的行状态和行为. 2. 类可以包含的变量 类型 局部变量 成员变量 类变量(静态变量) 定义位置 方法.或语句块中 类中, ...

  4. 关于虚拟机VM

    装Vmware虚拟机+安装系统不再困难 不要再以为你是女生,你就可以不用学装系统,亲,我们是计算机系的女生,顶起!!呼啦呼啦,这篇我装VM+系统的记录,作为勉励. 想必很多人都会使用到虚拟机,因为我们 ...

  5. GWT 实现文件上传和下载

    首先下载两个包 commons-fileupload-?.jar和commons-io-?.jar  将他们配置到你的项目中 先把它们放在 "项目名/war/WEB-INF/lib" ...

  6. 找出数组中出现奇数次的元素<异或的应用>

    点击打开链接:百度面试题之找出数组中之出现一次的两个数(异或的巧妙应用) 题目描述|:给定一个包含n个整数的数组a,其中只有一个整数出现奇数次,其他整数都出现偶数次,请找出这个整数 使用异或操作,因为 ...

  7. 用高德地图API 通过详细地址获得经纬度

    http://cloud.sinyway.com/Service/amap.html http://restapi.amap.com/v3/geocode/geo?key=xxxxxxxxxxxxxx ...

  8. XMind十大最有用的功能

    XMind十大最有用的功能 XMind是一款顶级商业品质的思维导图软件和头脑风暴软件,在企业和教育领域都有很广泛的应用,XMind功能全面,易上手,在此小编给大家整理出了XMind十大最有用的功能以供 ...

  9. careercup-栈与队列 3.6

    3.6 编写程序,按升序对栈进行排序(即最大元素位于栈顶).最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中(如数组).该栈支持如下操作:push.pop.peek和isEmpt ...

  10. careercup-栈与队列 3.3

    3.3 栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下.因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起.实现数据结构SetOfStacks 来模拟这种情况.Se ...