iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中出现内存泄漏与溢出如何解决
  • 637
分享到

Java中出现内存泄漏与溢出如何解决

2023-06-15 02:06:52 637人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Java中出现内存泄漏与溢出如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、浅析内存泄露( memory leak):是指程序在申请内存后,无法释放已申

这篇文章将为大家详细讲解有关Java中出现内存泄漏与溢出如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、浅析

内存泄露( memory leak):是指程序在申请内存后,无法释放已申请的内存空间,多次内存泄露堆积后果很严重,内存迟早会被占光。内存泄漏最终会造成内存溢出。
内存溢出(out of memory) :是指程序在申请内存时,没有足够的内存空间供其使用

JVM中有一下几种内存空间:

  • 栈内存(Stack):每个线程私有的。

  • 堆内存(Heap):所有线程公用的。

  • 方法区(Method Area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息。

  • 原生方法栈(Native Method Stack):主要用于JNI中的原生代码,平时很少涉及。

Java的内存回收机制:

Java堆是一个运行时数据区,类的实例(对象)从中分配空间,JVM堆中储存着正在运行的应用程序所建立的所有对象,“垃圾回收”主要也是和堆有关。

不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址,Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的。

二、Java内存泄露

内存泄露是指当前未被引用的对象持续占用内存导致内存空间的浪费。常见的内存泄漏有以下几大类:

(1)静态集合类引起
比如说静态HashMap、Vector等,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放。

Static Vector v = new Vector(10);for (int i = 1; i<100; i++){Object o = new Object();v.add(o);o = null;}//

如上所示,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身(o=null),那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。
必须要降Vector对象设置为null,才能回收这部分占用的内存

(2)当集合里面的对象属性被修改后,再调用remove()方法时不起作用。

主要原因是:set类存储对象是通过hashcode存储,如对象属性被修改,remove方法就不能通过原先的hashcode删除对象。

public static void main(String[] args){Set<Person> set = new HashSet<Person>();Person p1 = new Person("唐僧","pwd1",25);Person p2 = new Person("孙悟空","pwd2",26);Person p3 = new Person("猪八戒","pwd3",27);set.add(p1);set.add(p2);set.add(p3);System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素!p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变,remove是通过hashcode删除对象set.remove(p3); //此时remove不掉,造成内存泄漏set.add(p3); //重新添加,居然添加成功System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素!for (Person person : set){System.out.println(person);}}

(3)监听器

监听器调用太多,释放对象时未删除监听器也可能造成内存泄漏

(4)各种连接

数据库连接(dataSourse.getConnection()),网络连接(Socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。Connection一旦回收,Resultset 和Statement 对象就会立即为NULL

如果使用连接池,Resultset 和Statement 对象也需要显式的关闭,否则就会造成大量的Statement 对象无法释放,从而引起内存泄漏,这种情况下一般都会在try里面去的连接,在finally里面释放连接。

(5)单例模式

如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,就会导致内存泄露。
比如说:

class A{public A(){B.getInstance().setA(this);}....}//B类采用单例模式class B{private A a;private static B instance=new B();public B(){}public static B getInstance(){return instance;}public void setA(A a){this.a=a;}//getter...}

显然B采用singleton模式,它持有一个A对象的引用,而这个A类的对象将不能被回收

三、Java内存溢出

当内存占有量超过了虚拟机的分配的最大值时就会产生内存溢出(JVM里面分配不出更多的page)
一般出现情况:

  • 加载的图片太多或图片过大时

  • 分配特大的数组

  • 内存相应资源过多没有来不及释放。

JVM内存模型:

Java中出现内存泄漏与溢出如何解决

Java应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:Heap space(堆空间)和Permgen(永久代)。

(1)JVM Heap堆溢出:java.lang.OutOfMemoryError: Java heap space

在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息。

JVM启动时会自动设置JVM Heap的值,可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置,当需要为对象实例分配内存,而堆的内存占用又已经达到-Xmx设置的最大值。将会抛出OutOfMemoryError异常。

解决方法:手动设置JVM Heap(堆)的大小。

(2)PermGen space溢出: java.lang.OutOfMemoryError: PermGen space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。

PermGen space主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,sun的 GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。一般发生在程序的启动阶段

解决方法: 通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可。

(3)栈溢出: java.lang.StackOverflowError : Thread Stack space

调用构造函数的 “层”太多了,以致于把栈区溢出了。通俗一点讲就是单线程的程序需要的内存太大了。 通常递归也不要递归的层次过多,很容易溢出。

解决方法:

修改程序。

通过 -Xss: 来设置每个线程的Stack大小即可。

在Java虚拟机规范中,对这个区域规定了两种异常状况:

  • StackOverflowError异常:启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。当线程调用java方法时,虚拟机压入一个新的栈帧到该线程的java栈中。只要这个方法还没有返回,它就一直存在。如果线程的方法嵌套调用层次太多(如递归调用),随着java栈中帧的逐渐增多,最终会由于该线程java栈中所有栈帧大小总和大于-Xss设置的值,而产生StackOverflowError内存溢出异常

  • OutOfMemoryError异常:启动一个新线程时,没有足够的内存空间为该线程分配java栈(一个线程java栈的大小由-Xss参数确定),jvm则抛出OutOfMemoryError异常

Java的优点是什么

1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面向网络的语言;4. 鲁棒性,java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。;5. 安全性,用于网络、分布环境下的Java必须防止病毒的入侵。6. 体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7. 可移植性,Java可以方便地移植到网络上的不同机器。8.解释执行,Java解释器直接对Java字节码进行解释执行。

关于Java中出现内存泄漏与溢出如何解决就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Java中出现内存泄漏与溢出如何解决

本文链接: https://www.lsjlt.com/news/276833.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中出现内存泄漏与溢出如何解决
    这篇文章将为大家详细讲解有关Java中出现内存泄漏与溢出如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、浅析内存泄露( memory leak):是指程序在申请内存后,无法释放已申...
    99+
    2023-06-15
  • java中出现内存泄漏如何解决
    java中出现内存泄漏如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的...
    99+
    2023-06-14
  • Java基础之内存泄漏与溢出详解
    目录一、浅析二、Java内存泄露三、Java内存溢出一、浅析 内存泄露( memory leak):是指程序在申请内存后,无法释放已申请的内存空间,多次内存泄露堆积后果很严重,内存迟...
    99+
    2024-04-02
  • java中内存泄漏和内存溢出是什么
    内存泄漏(Memory Leak)是指在程序运行过程中,因为不正确的内存管理而导致一部分内存无法被回收的现象。当程序中的对象不再被使...
    99+
    2023-08-25
    java
  • java项目中出现内存泄漏如何解决
    本篇文章为大家展示了java项目中出现内存泄漏如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向...
    99+
    2023-06-14
  • java中出现内存溢出如何解决
    本篇文章为大家展示了java中出现内存溢出如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了...
    99+
    2023-06-14
  • Java中出现堆内存溢出如何解决
    今天就跟大家聊聊有关Java中出现堆内存溢出如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
    99+
    2023-06-15
  • android内存溢出和内存泄漏问题怎么解决
    Android内存溢出和内存泄漏是常见的问题,可以通过以下方法来解决:1. 使用内存分析工具:可以使用Android Studio自...
    99+
    2023-08-26
    android
  • JavaScript内存泄漏和内存溢出是什么
    本篇内容主要讲解“JavaScript内存泄漏和内存溢出是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript内存泄漏和内存溢出是什么”吧! ...
    99+
    2024-04-02
  • Java 中出现内存泄露如何解决
    这期内容当中小编将会给大家带来有关Java 中出现内存泄露如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先,我用下面的命令监视进程:while ( sleep 1&...
    99+
    2023-06-17
  • java内存溢出如何解决
    Java内存溢出(Out of Memory Error)是指Java程序在运行过程中申请的内存超出了JVM所能提供的最大内存限制,...
    99+
    2023-10-28
    java
  • java内存泄漏和内存溢出的原因是什么
    Java内存泄漏和内存溢出的原因如下:1. 内存泄漏:内存泄漏指的是在程序运行过程中,无用的对象仍然被保持在内存中,导致内存占用不断...
    99+
    2023-08-26
    java
  • java中list内存溢出如何解决
    在Java中,List的内存溢出问题通常是由于大量数据的存储导致的。以下是一些可能的解决方法:1. 增加JVM的堆内存:通过设置JV...
    99+
    2023-10-09
    java
  • java堆内存溢出如何解决
    Java堆内存溢出指的是在Java应用程序中分配给Java堆的内存空间不足,导致无法继续正常执行程序。要解决Java堆内存溢出问题,...
    99+
    2023-08-23
    java
  • Android 5.1应用中 WebView出现内存泄漏如何解决
    今天就跟大家聊聊有关Android 5.1应用中 WebView出现内存泄漏如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题背景在排查项目内存泄漏过程中发现了一些由WebV...
    99+
    2023-05-31
    android webview 内存泄漏
  • android内存溢出和内存泄漏有什么区别
    Android内存溢出和内存泄漏是两个不同的问题。1. 内存溢出(Memory Overflow):内存溢出指的是当应用程序分配的内...
    99+
    2023-08-08
    android
  • java递归内存溢出如何解决
    解决Java递归内存溢出的方法有以下几种:1. 优化递归算法:检查递归算法是否可以通过迭代或其他非递归方式进行优化,以减少内存消耗。...
    99+
    2023-08-31
    java
  • java内存泄漏如何解决
    今天小编给大家分享一下java内存泄漏如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、单例引起的内存泄漏。,由于单...
    99+
    2023-06-30
  • php内存溢出如何解决
    PHP 内存溢出指的是在运行 PHP 脚本时,脚本所使用的内存超出了 PHP 预设的内存限制。解决 PHP 内存溢出问题可以采取以下...
    99+
    2023-09-26
    php
  • Java中内存泄露与溢出的区别是什么
    这期内容当中小编将会给大家带来有关Java中内存泄露与溢出的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java内存泄露与溢出的区别内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作