「java资源泄露」java资源泄露,从未关闭怎么办
本篇文章给大家谈谈java资源泄露,以及java资源泄露,从未关闭怎么办对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java中-资源泄露,input从未关闭,怎么解决?
 - 2、Java内存泄露和内存泄露的区别
 - 3、java内存溢出是什么情况?
 - 4、java 内存泄露问题
 - 5、java内存泄露是什么意思?
 - 6、如何排查Java内存泄露
 
java中-资源泄露,input从未关闭,怎么解决?
一般情况下流用完需要写*.close(),但是System.in是控制台的输入流,不需要关闭,关闭之后其他地方使用会报错。
所以有两种解决方法,第一种是把这个类型声明放到类里面,第二种是打一个注解让IDE忽略这个警告
Java内存泄露和内存泄露的区别
答:Java内存泄露与溢出的区别:
内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。ava内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽)。看到上面的解释,可能有些朋友还是不太理解吧。没问题,看以下例子
Java内存泄露是说程序逻辑问题,造成申请的内存无法释放.这样的话无论多少内存,早晚都会被占用光的.最简单的例子就是死循环了.由于程序判断错误导经常发生此事
Java内存泄漏是指在堆上分配的内存没有被释放,从而失去对其控制。这样会造成程序能使用的内存越来越少,导致系统运行速度减慢,严重情况会使程序当掉。
关于内存溢出有点出入。比如说你申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
举个现实中的例子:比如有一个桶,装满了水.你丢个苹果进去。桶的水正常。如果你放个大石头。水就出溢出,内存溢出也就是这个原理。
区别:内存溢出,提供的内存不够;Java内存泄漏,无法再提供内存资源
java内存溢出是什么情况?
首先先说一下JVM内存结构问题,JVM为两块:PermanentSapce和HeapSpace,其中\x0d\x0aHeap = }。PermantSpace负责保存反射对象,一般不用配置。JVM的Heap区可以通过-X参数来设定。\x0d\x0a 当一个URL被访问时,内存申请过程如下:\x0d\x0aA. JVM会试图为相关Java对象在Eden中初始化一块内存区域\x0d\x0aB. 当Eden空间足够时,内存申请结束。否则到下一步\x0d\x0aC. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区\x0d\x0aD. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区\x0d\x0aE. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)\x0d\x0aF. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”\x0d\x0a\x0d\x0aJVM调优建议:\x0d\x0a\x0d\x0ams/mx:定义YOUNG+OLD段的总尺寸,ms为JVM启动时YOUNG+OLD的内存大小;mx为最大可占用的YOUNG+OLD内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。\x0d\x0aNewSize/MaxNewSize:定义YOUNG段的尺寸,NewSize为JVM启动时YOUNG的内存大小;MaxNewSize为最大可占用的YOUNG内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。\x0d\x0aPermSize/MaxPermSize:定义Perm段的尺寸,PermSize为JVM启动时Perm的内存大小;MaxPermSize为最大可占用的Perm内存大小。在用户生产环境上一般将这两个值设为相同,以减少运行期间系统在内存申请上所花的开销。\x0d\x0aSurvivorRatio:设置Survivor空间和Eden空间的比例\x0d\x0a\x0d\x0a内存溢出的可能性\x0d\x0a\x0d\x0a1. OLD段溢出\x0d\x0a这种内存溢出是最常见的情况之一,产生的原因可能是:\x0d\x0a1) 设置的内存参数过小(ms/mx, NewSize/MaxNewSize)\x0d\x0a2) 程序问题\x0d\x0a单个程序持续进行消耗内存的处理,如循环几千次的字符串处理,对字符串处理应建议使用StringBuffer。此时不会报内存溢出错,却会使系统持续垃圾收集,无法处理其它请求,相关问题程序可通过Thread Dump获取(见系统问题诊断一章)单个程序所申请内存过大,有的程序会申请几十乃至几百兆内存,此时JVM也会因无法申请到资源而出现内存溢出,对此首先要找到相关功能,然后交予程序员修改,要找到相关程序,必须在Apache日志中寻找。\x0d\x0a当Java对象使用完毕后,其所引用的对象却没有销毁,使得JVM认为他还是活跃的对象而不进行回收,这样累计占用了大量内存而无法释放。由于目前市面上还没有对系统影响小的内存分析工具,故此时只能和程序员一起定位。\x0d\x0a\x0d\x0a2. Perm段溢出\x0d\x0a通常由于Perm段装载了大量的Servlet类而导致溢出,目前的解决办法:\x0d\x0a1) 将PermSize扩大,一般256M能够满足要求\x0d\x0a2) 若别无选择,则只能将servlet的路径加到CLASSPATH中,但一般不建议这么处理\x0d\x0a\x0d\x0a3. C Heap溢出\x0d\x0a系统对C Heap没有限制,故C Heap发生问题时,Java进程所占内存会持续增长,直到占用所有可用系统内存\x0d\x0a\x0d\x0a参数说明:\x0d\x0a\x0d\x0aJVM 堆内存(heap)设置选项 \x0d\x0a 参数格式 \x0d\x0a 说 明 \x0d\x0a \x0d\x0a设置新对象生产堆内存(Setting the Newgeneration heap size) \x0d\x0a -XX:NewSize \x0d\x0a 通过这个选项可以设置Java新对象生产堆内存。在通常情况下这个选项的数值为1 024的整数倍并且大于1MB。这个值的取值规则为,一般情况下这个值-XX:NewSize是最大堆内存(maximum heap size)的四分之一。增加这个选项值的大小是为了增大较大数量的短生命周期对象 \x0d\x0a\x0d\x0a增加Java新对象生产堆内存相当于增加了处理器的数目。并且可以并行地分配内存,但是请注意内存的垃圾回收却是不可以并行处理的 \x0d\x0a \x0d\x0a设置最大新对象生产堆内存(Setting the maximum New generation heap size) \x0d\x0a -XX:MaxNewSize \x0d\x0a 通过这个选项可以设置最大Java新对象生产堆内存。通常情况下这个选项的数值为1 024的整数倍并且大于1MB \x0d\x0a\x0d\x0a其功用与上面的设置新对象生产堆内存-XX:NewSize相同\x0d\x0a\x0d\x0a设置新对象生产堆内存的比例(Setting New heap size ratios) \x0d\x0a -XX:SurvivorRatio \x0d\x0a 新对象生产区域通常情况下被分为3个子区域:伊甸园,与两个残存对象空间,这两个空间的大小是相同的。通过用-XX:SurvivorRatio=X选项配置伊甸园与残存对象空间(Eden/survivor)的大小的比例。你可以试着将这个值设置为8,然后监控、观察垃圾回收的工作情况\x0d\x0a\x0d\x0a设置堆内存池的最大值(Setting maximum heap size) \x0d\x0a -Xmx \x0d\x0a 通过这个选项可以要求系统为堆内存池分配内存空间的最大值。通常情况下这个选项的数值为1 024的整数倍并且大于1 MB \x0d\x0a\x0d\x0a一般情况下这个值(-Xmx)与最小堆内存(minimum heap size _Xms)相同,以降低垃圾回收的频度 \x0d\x0a \x0d\x0a取消垃圾回收 \x0d\x0a -Xnoclassgc \x0d\x0a 这个选项用来取消系统对特定类的垃圾回收。它可以防止当这个类的所有引用丢失之后,这个类仍被引用时不会再一次被重新装载,因此这个选项将增大系统堆内存的空间 \x0d\x0a \x0d\x0a设置栈内存的大小 \x0d\x0a -Xss \x0d\x0a 这个选项用来控制本地线程栈的大小,当这个选项被设置的较大(2MB)时将会在很大程度上降低系统的性能。因此在设置这个值时应该格外小心,调整后要注意观察系统的性能,不断调整以期达到最优 \x0d\x0a \x0d\x0a最后说一句,你的机器的连接数设置也至关重要,连接的关闭最好把时间设置的少些,那些连接非常耗费资源。也是引起内存泄露的主要原因。
java 内存泄露问题
Java中虽然使用了gc策略,但事实上还是会出现内存泄漏现象的,java因此还提出了弱引用等局部解决方案。
但楼主说的System.exit(0)是不会形成内存泄漏的。
其实这里都是两个范畴的内存了。楼上以及我开始说的Java中的内存是指虚拟机的内存,映射到宿主机可以有各种实现,虽然一般也是映射到内存。 而System.exit(0)会析构掉虚拟机,也就是把这个虚拟的机器都拆了,也就无从谈起虚拟机内存泄漏不泄漏的概念,正所谓皮之不存,毛将焉附。而问题是宿主机的内存是否泄漏了。从原理上说,虚拟机运行时,不管执行怎样的指令,映射到宿主机器资源,都回在机器被拆掉时释放。当然,从实现上说,如果宿主操作系统,或者JVM有bug,当然有可能造成内存泄漏,但和java程序员写的客户程序无关。(补充:包括在宿主机内杀java进程,其资源回收问题是操作系统和java平台的责任。我们在古老的操作系统经常会遇到文件没正常关闭之类的问题,但现在的操作系统这些问题应该不会很大,也就是宿主机其实也有一定的回收机制,包括内存回收,但着本身不是内存泄漏的范畴,内存泄漏是指程序运行时的客户程序造成的内存资源失控。当客户程序退出时的问题,就是操作系统设计的范畴了)
java内存泄露是什么意思?
Java内存泄露\x0d\x0a一般来说内存泄漏有两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。\x0d\x0a可能光说概念太抽象了,大家可以看一下这样的例子:\x0d\x0a1Vectorv=newVector(10);\x0d\x0a2for(inti=1;i
回答于 2022-12-14
如何排查Java内存泄露
1. Memory Analyzer-是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。
2. JProbe-分析Java的内存泄漏。
3. JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中,GUI可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。
4. JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。
5. YourKit .NET Java Profiling业界领先的Java和.NET程序性能分析工具。
6. AutomatedQA -AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq 和 GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。
7. Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。
java资源泄露的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java资源泄露,从未关闭怎么办、java资源泄露的信息别忘了在本站进行查找喔。