java 内存机制简介
java内存回收机制
不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。java中对象是采用new或者反射的方法创 建的,这些对象的创建都是在堆中分配,所有对象的回收都是由java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状 况,对他们的申请、引用、被引用、赋值等状况进行监控,java会使用有向图的方法进行管理内存,实时监控是否可以到达,如果不可达,则将其回收,这样也 可以消除应用循环的问题。在java语言中,判断一个内存空间是否符合垃圾收集标准有两个:一个给对象赋予了空值null,以下再没有调用过。另一个是给 对象赋予了新值,这样重新分配了空间。
java内存泄露和内存溢出
java内存泄露就是没有及时清理内存垃圾,导致系统无法再提供给你内存资源(内存资源耗尽);而java内存溢出就是你要求分配的内存超出了系统所能给你的,系统不能满足需求,于是产生溢出。
java内存泄露和内存溢出的区别
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求, 于是产生溢出。
java内存泄露就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源。
1、java内存泄露其实就是程序的逻辑问题,造成申请的内存无法释放,这样的话无论多少内存,早晚会被占用光。最简单的例子就是死循环。由于程序判断错误经常出现此类问题。
2、java内存泄露是指在堆上分配的内存没有被释放,从而失去对其控制。这样会造成程序能使用的内存越来越少,导致系统运行速度减慢,严重情况会使程序当掉。
3、内存溢出是比如你申请了一个Integer,但是你存了一个long类型才能存下的数,那么就会造成内存溢出。
区别:内存溢出是提供的内存不够;内存泄露是无法提供内存资源。
java内存泄露的几个原因
1、静态集合类象Hash、Vector等的使用最容易引起内存泄露,这些静态变量的声明周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将被Vector等应用着。
2、内部类和外部类的使用容易引起内存泄露的问题。内部类的引用时比较容易遗忘的一种,而且一旦没有释放就可能导致一系列的后继类对象没有释放。此 外程序员还要小心外部模块的不经意的引用。例如程序员A负责A模块,调用了B模块的一个方法如:public void registerMsg(Object b);这种调用就要非常小心,传入了一个对象,很可能模块B就保持了对该对象的引用,这时候就需要注意模块B是否提供相应的操作去除引用。
3、监听器的使用,java往往会用到监听器,在释放对象的时候没有响应删除监听器的时候也可能导致内存泄露。
4、大量临时变量的使用,没有及时将对象设置为null也可能会导致内存的泄露。
5、数据库的连接没有关闭的情况,包括连接池方法链接数据库,如果没有关闭ResultSet等也可能会出现内存泄露的问题。数据库连接,网络连接 和io连接,除非其显式调用了其close()方法将其连接关闭,否则是不会自动被GC回收的。对于ResultSet和Statement对象可以不进 行显示回收,但Connection一定要现实回收,因为Connection在任何时候都无法自动回收,而Connection一旦回 收,ResultSet和Statement对象就会被设置为null,但是如果没有连接池,情况就不一样了,除了要显示地关闭连接,还必须显示关闭 ResultSet Statement对象(关闭其中一个,另一个也会关闭),否则就会造成大量Statement对象无法释放,从而引起内存泄露。这种情况下一般都会在 try里面去连接,在finally里面释放连接。