9.垃圾回收机制和JVM
Posted 走遍天涯心随你起落
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.垃圾回收机制和JVM相关的知识,希望对你有一定的参考价值。
9.垃圾回收机制和JVM
1.GC(Garbage Coolection)指垃圾回收机制。没有提供相关api,手动回收,所有的内存分配和回收权限都在jvm中
2.System.gc():呼叫java虚拟机的垃圾回收器运行回收内存的垃圾
3.finalize()方法
当垃圾回收器认为一个对象没有存在意义时,会回收该对象的内存,会调用该对象的finalize()方法,释放该对象在堆中占用的内存(继承于Object类)
4.垃圾回收的优点和原理。并考虑2种回收机制
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
5.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
6.Java中的异常处理机制的简单原理和应用
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
7.GC 如何判断对象失去引用
GC 判断对象引用是否可达是从 Root 根目录开始判断的,在 JVM 中可以作为 gc root 的有:JVM 栈中对象引用(主要)、方法区中引用的对象、JNI 方法引用的对象、静态区域中引用的对象(一般不回收)。对于多层结构的,则已递归的方式查找,能到达的都是不会被 GC 的对象。
8.java内存泄漏的原因有哪些
首先造成 Java JVM 泄露的主要原因:JVM 未及时的对垃圾进行回收造成的;当对象失去引用且持续占有内存或无用对象的内存得不到及时释放,从而造成内存 空间的浪费称为内存泄漏。造成这种对象无法及时释放导致内存泄露的原因,可以简单 的为归分两类。
一是基于设计方面:
1、对应用加载数据级别判断失误,从而导致 JVM 内存分配不合理(企业单机部署应用常见到)。
2、应用请求的常连接设计,常连接会一直占用后台资源,不能及时释放。3、数据库操作时,存在很多耗时连接,导致大量资源不能释放。4、 大量的监听设计等。
二是基于开发方面:
1、大量静态变量的使用(静态变量的生成周期与应用一致),如果静态引用指向的是集合或者数据,会一直占用资源。
2、不合理的方法使用,比如 jdk6 之前的 substring 就可能导致内存泄露。
3、数据库连接未能及时关闭,刚工作不久的同学容易忽略。
4、单例模式使用,单例通常用来加载资源信息,但如果加载信息里有大量的集合、数组等对象,这些资源会一直驻留内存中,不易释放。
5、在循环中创建复杂对象、 一次性读取加载大量信息到内存中,都有可能造成内存泄露。
以上是关于9.垃圾回收机制和JVM的主要内容,如果未能解决你的问题,请参考以下文章