一、java引用的种类

1、对象在内存中的状态

可达状态:当一个对象被创建后,有一个以上的引用变量指向它。

可恢复状态:

不可达状态:当对象的所有关联被切断,且系统调用所有对象的finalize方法依然没有使该对象变成可达状态,那该对象将永久性的失去所有引用,最后变成不可达状态。

2、引用的类型

强引用:

软引用:

弱引用:

虚引用:

二、java的内存泄露

三、垃圾回收机制

1、垃圾回收算法

串行(Serial)回收和并行(Parallel)回收:串行是始终只有一个CPU在执行垃圾回收操作;并行是把整个回收工作拆分成多个部分,每一部分由一个CPU负责,从而让多个CPU并行回收。并行回收效率高,但复杂度增加,内存碎片增加。

并发(Concurrent)执行和应用程序停止(Stop-the-world):

压缩(Compacting)、不压缩(Non-Compacting)和复制(Copying):为了减少内存碎片,支持压缩的垃圾回收器会把所有的活动对象搬迁到一起,然后将之前占用的内存全部回收。不压缩的垃圾回收只会回收内存,这样回收来的内存不是连续的,造成内存碎片。不压缩的相对于压缩式的,回收比较快,但内存分配慢。复制的垃圾回收会把所有的可达对象拷贝到另一块相同的内存中,优点是垃圾回收过程中不会产生内存碎片,缺点是需要复制数据和额外的内存。

标记清除(mark-sweep):不压缩

标记压缩(mark-sweep-compact):压缩式

2、堆内存的分代回收

yong:

old:

permanent:

3、与垃圾回收的附加选项

-Xmx:java虚拟机堆内存的最大容量

-Xms:初始容量

-XX:MinHeapFreeRatio=40

-XX:MaxHeapFreeRatio=70

-XX:NewRatio=2

-XX:NewSize=64m

-XX:SurvivalRatio=8

-XX:MaxNewSize=128m

-XX:PermSize=128m

-XX:MaxPermSize=128m

4、常见的垃圾回收器

串行回收器:yong,串行复制;old,串行标记压缩

并行回收器:

并行压缩回收器(Parallel Compacting Collector):

并发标记-清理(mark-sweep)回收器:

四、内存管理的小技巧

1、尽量使用直接量;

String str="hello world";

String str=new String("hello world");

2、使用StringBuilder和StringBuffer进行字符串连接;

3、尽早释放无用对象的引用;

obj=null;

4、尽量少用静态变量;

与类的生命周期同步。

5、避免在经常调用、循环的方法中创建对象;

6、缓存经常使用的对象;

牺牲系统空间换取运行时间

7、尽量不要使用finalize方法;

在对象失去引用之后,垃圾回收器回收该对象之前,垃圾回收机制会先调用该对象的finalize方法进行资源清理。

8、考虑使用SoftReference;

Java的内存回收的更多相关文章

  1. 谈JAVA的内存回收(一)

    谈JAVA的内存回收 程序员需要通过关键字new创建Java对象,即可视为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除他 ...

  2. Java的内存回收机制

    原文出处: cnblogs-小学徒V 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C ...

  3. [转载]Java的内存回收机制

    转自:http://www.admin10000.com/document/1671.html 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由J ...

  4. 从Java虚拟机的内存区域、垃圾收集器及内存分配原则谈Java的内存回收机制

    一.引言: 在Java中我们只需要轻轻地new一下,就可以为实例化一个类,并分配对应的内存空间,而后似乎我们也可以不用去管它,Java自带垃圾回收器,到了对象死亡的时候垃圾回收器就会将死亡对象的内存回 ...

  5. [java,2017-05-15] 内存回收 (流程、时间、对象、相关算法)

    内存回收的流程 java的垃圾回收分为三个区域新生代.老年代. 永久代 一个对象实例化时 先去看伊甸园有没有足够的空间:如果有 不进行垃圾回收 ,对象直接在伊甸园存储:如果伊甸园内存已满,会进行一次m ...

  6. Java jvm 内存回收机制

    http://blog.csdn.net/yaerfeng/article/details/51291903 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方 ...

  7. Java的内存回收机制详解X

    http://blog.csdn.net/yqlakers/article/details/70138786 1 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前 ...

  8. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  9. 为什么JAVA的垃圾回收机制无法避免内存泄漏

    一.本文参考:    1.<深入理解java虚拟机 JVM高级特性与最佳实践>    2.http://coderevisited.com/memory-leaks-in-java/   ...

随机推荐

  1. SpringMVC05 return (Json)

    这里要主要的是js文件要引入,文中不做解释 1.导入包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  2. C# 的两种debug 方法

    第一种:需要把调试方法改成debug代码用 #if DEBUG 包裹 using System; using System.Collections.Generic; using System.Text ...

  3. laydate 显示结束时间不小于开始时间

    jsp: <div class="form-group">    <label >交易时间:</label>        <input ...

  4. oracle数据库,表被锁,如何解锁?

    4.批量解锁declare cursor mycur isselect b.sid,b.serial# from v$locked_object a,v$session bwhere a.sessio ...

  5. arcgis textsymbol overlap

    arcgis  textsymbol   overlap   textsymbol  重叠的问题  du?de?  duration??    arcgis  for  javascript 如何避免 ...

  6. PHP函数:method_exists和function_exists

    method_exists 检查类的方法是否存在 bool method_exists ( mixed $object , string $method_name ) 检查类的方法是否存在于指定的ob ...

  7. 工作流性能优化(敢问activiti有扩展性?)(3)

    2015/4/20 周末回去想了下,hibernate.mybatis.jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了: 看了配 ...

  8. 问题 B: Curriculum Vitae

    问题 B: Curriculum Vitae 时间限制: 1 Sec  内存限制: 128 MB提交: 109  解决: 25[提交][状态][讨论版][命题人:acm4302] 题目描述 Hideo ...

  9. fflush - 刷新一个流

    SYNOPSIS 总览 #include <stdio.h> int fflush(FILE *stream); DESCRIPTION 描述 函数 fflush 强制在所给的输出流或更新 ...

  10. jquery循环获取name相同的元素

    今天做项目时,用到一种用jquery循环获取name相同的按钮,并且完成点击事件,记录一下 首先整段的html,是用js拼出来的(项目需求) getStudentArticle:function(op ...