内存泄露和内存溢出



内存溢出:比如你将一个100MB的文件转换成流,即将100MB的东西读到内存,如果一直不关闭,则java认为你一直在使用,就不进行垃圾回收,有可能导致内存溢出。

 

Java的内存溢出和内存泄露

Java基础恶补——内存泄露、内存溢出https://blog.csdn.net/wisgood/article/details/16818243

 

//不太好的文章:java内存溢出: https://blog.csdn.net/eff666/article/details/52071873

 

内存管理与GC机制: https://blog.csdn.net/suifeng3051/article/details/48292193

 

  1. 内存泄露:指在程序运行期间动态分配了内存,但在程序结束时没有释放该部分内存,从而造成那部分内存不可用的情况,有时候重启计算机可以解决,但是一旦运行还是会发生同样的情况,内存泄露和硬件没有关系,是软件设计缺陷引起的。

 

 

方法区:存放了要加载的类的信息,类中的静态变量,final定义的常量,类中的field,方法信息等,方法区是共享的,在一定条件下,也会被GC,当方法区使用的内存超过它允许的大小,就会抛出OutOfMemoryPermGen Space异常

hotspot虚拟机中,这块区域对应的是Permanent Generation(持久代),一般的,方法区的垃圾收集是很少的,因此方法区又被称为持久代的原因之一,但这也不代表在方法区没有垃圾收集

Java方法区的相关参数:最小值:-xx:PerSize;最大值-xx:MaxPermSize.

堆区: 堆区是理解JavaGC机制最重要的区域,在JVM管理的内存中,堆区是最大的一块,堆区也是由所有线程共享,在虚拟机启动时创建,堆区用来存储对象实例及数组值,可以认为java中所有通过new 创建的对象都在此分配。

对于堆区大小,可以通过参数-Xms-Xmx来控制,-XmsJVM启动时申请的最小内存和最大内存

Java 对象访问方式:

一般来说,一个java的引用访问涉及到3个内存区域:JAVA(JVM),,方法区

Object objRef = new Object()为例:

  1. Object objRef表示一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型数据

  2. new Object()做为实例对象数据存储在堆中,

  3. 堆中还记录了此Object对象的类型数据(接口,方法,field,对象类型),实际的数据则存储在方法区中。

 

 

内存溢出类型:

  1. java.lang.OutOfMemoryError:PermGen space ----在方法区主要存放class信息,加载的类的信息,类中的静态变量,final定义的常量,类中的field,方法信息等,方法区是共享的。

常出现该错误的场合:

应用程序中有很多class,web服务器对JSP进行预编译时

Webapps下用了大量的第三方jar,其大小超过了JVM默认的大小4M

  1. java.lang.OutOfMemoryError:Javaheap space

    -----JVM中如果98%的时间是用于GC且可用的Heap size不足2%的时候将抛出此异常该错误常见场合:

    Web上传文件时

    开启大型文件或从数据库一次取了太多的数据

 

编码基本规范: https://blog.csdn.net/y13156556538/article/details/70045656

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值