Java中垃圾回收和静态类型
2015-08-30 20:43
316 查看
今天在网上看到一个讨论命题:当一个单例的对象长久不用时,会不会被jvm的垃圾收集机制回收。原文链接
下面就对Java中的垃圾回收和静态类型做一些总结:
2、heap(堆) ,用于装new出来的值。
3、用来装静态变量的区域。如static变量,字符串常量。
4、用来装代码的区域。
2、堆里的对象,没有任何变量(栈上变量或静态区域的变量)指向这个对象的时候就会被回收,这个对象被标记为“垃圾对象”等待回收GC
3、GC是只回收堆空间,检查定时回收(频率由GLR决定)。
4、调用GC.Collect();“直接”回收对象(必须等GC处理完目前的任务,才来处理该任务)。
静态基本类型存储在在静态变量区域;静态引用类型的引用存储在静态变量区域,而实例(具体内容)存储在堆上。静态成员只存在一份,静态成员加载时机:类加载的时候(第一次访问),这个类中所有静态成员就会被加载在静态存储区,同时存储在静态变量区域的成员一旦创建,直到程序退出才会被回收。(注:如果是引用类型,如static student myst=new student(),myst=null这时候,在静态存储区里面存的是一个地址(myst),这个地址指向在堆里面创建的student实例对象,当myst=null的时候,在静态存储区里面的变量会一直存在,但是在堆里面的student实例对象因为没有变量指向它,所以会被回收)。因此如果不用的静态引用类型可以通过设置=null方式让GC可以回收其堆上的空间。
下面就对Java中的垃圾回收和静态类型做一些总结:
一、Java中的内存分配
1、stack(栈),用于装变量和引用类型。如基本类型和引用类型的引用变量。2、heap(堆) ,用于装new出来的值。
3、用来装静态变量的区域。如static变量,字符串常量。
4、用来装代码的区域。
二、垃圾回收时机
1、栈上的变量一旦声明,出作用域即会被回收。2、堆里的对象,没有任何变量(栈上变量或静态区域的变量)指向这个对象的时候就会被回收,这个对象被标记为“垃圾对象”等待回收GC
3、GC是只回收堆空间,检查定时回收(频率由GLR决定)。
4、调用GC.Collect();“直接”回收对象(必须等GC处理完目前的任务,才来处理该任务)。
三、静态成员的垃圾回收
静态成员一般也可以分为静态基本类型和静态引用类型。静态基本类型存储在在静态变量区域;静态引用类型的引用存储在静态变量区域,而实例(具体内容)存储在堆上。静态成员只存在一份,静态成员加载时机:类加载的时候(第一次访问),这个类中所有静态成员就会被加载在静态存储区,同时存储在静态变量区域的成员一旦创建,直到程序退出才会被回收。(注:如果是引用类型,如static student myst=new student(),myst=null这时候,在静态存储区里面存的是一个地址(myst),这个地址指向在堆里面创建的student实例对象,当myst=null的时候,在静态存储区里面的变量会一直存在,但是在堆里面的student实例对象因为没有变量指向它,所以会被回收)。因此如果不用的静态引用类型可以通过设置=null方式让GC可以回收其堆上的空间。
四、单例模式中静态成员不会被垃圾回收机制回收
单例模式中静态成员的声明由于静态的机制不会被GC回收,而对应的堆上实例对象在外部无法直接设为null,所以不会被垃圾回收机制回收。当然除非人为地断开单例中静态引用到单例对象的联接,否则jvm垃圾收集器是不会回收单例对象的。相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- 解析C语言中位字段内存分配的问题
- C语言编程中分配内存空间的相关函数
- C#字符串内存分配与驻留池学习分享
- 基于C++内存分配、函数调用与返回值的深入分析
- PHP变量内存分配问题记录整理
- 理解Javascript_01_理解内存分配原理分析
- C/C++语言中结构体的内存分配小例子
- Java虚拟机JVM性能优化(二):编译器
- Java程序员必须知道的5个JVM命令行标志
- 浅析PHP的静态成员函数效率更高的原因
- C/C++动态分配与释放内存的区别详细解析
- C++类的静态成员初始化详细讲解
- JavaScript对内存分配及管理机制详细解析
- Java中内存分配的几种方法
- Java虚拟机JVM性能优化(三):垃圾收集详解
- JAVA中JVM的重排序详细介绍
- Java虚拟机JVM性能优化(一):JVM知识总结
- Android Studio 报错failed to create jvm error code -4的解决方法
- 解析Linux系统中JVM内存2GB上限的详解