内存泄露和内存溢出
内存溢出:比如你将一个100MB的文件转换成流,即将100MB的东西读到内存,如果一直不关闭,则java认为你一直在使用,就不进行垃圾回收,有可能导致内存溢出。
Java的内存溢出和内存泄露
Java基础恶补——内存泄露、内存溢出https://blog.****.net/wisgood/article/details/16818243
//不太好的文章:java内存溢出: https://blog.****.net/eff666/article/details/52071873
内存管理与GC机制: https://blog.****.net/suifeng3051/article/details/48292193
内存泄露:指在程序运行期间动态分配了内存,但在程序结束时没有释放该部分内存,从而造成那部分内存不可用的情况,有时候重启计算机可以解决,但是一旦运行还是会发生同样的情况,内存泄露和硬件没有关系,是软件设计缺陷引起的。
方法区:存放了要加载的类的信息,类中的静态变量,final定义的常量,类中的field,方法信息等,方法区是共享的,在一定条件下,也会被GC,当方法区使用的内存超过它允许的大小,就会抛出OutOfMemory:PermGen Space异常
在hotspot虚拟机中,这块区域对应的是Permanent Generation(持久代),一般的,方法区的垃圾收集是很少的,因此方法区又被称为持久代的原因之一,但这也不代表在方法区没有垃圾收集
Java方法区的相关参数:最小值:-xx:PerSize;最大值-xx:MaxPermSize.
堆区: 堆区是理解JavaGC机制最重要的区域,在JVM管理的内存中,堆区是最大的一块,堆区也是由所有线程共享,在虚拟机启动时创建,堆区用来存储对象实例及数组值,可以认为java中所有通过new 创建的对象都在此分配。
对于堆区大小,可以通过参数-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小内存和最大内存
Java 对象访问方式:
一般来说,一个java的引用访问涉及到3个内存区域:JAVA栈(JVM栈),堆,方法区
以Object objRef = new Object()为例:
Object objRef表示一个本地引用,存储在JVM栈的本地变量表中,表示一个reference类型数据
new Object()做为实例对象数据存储在堆中,
堆中还记录了此Object对象的类型数据(接口,方法,field,对象类型),实际的数据则存储在方法区中。
内存溢出类型:
java.lang.OutOfMemoryError:PermGen space ----在方法区主要存放class信息,加载的类的信息,类中的静态变量,final定义的常量,类中的field,方法信息等,方法区是共享的。
常出现该错误的场合:
应用程序中有很多class,web服务器对JSP进行预编译时
Webapps下用了大量的第三方jar,其大小超过了JVM默认的大小4M
-
java.lang.OutOfMemoryError:Javaheap space
-----在JVM中如果98%的时间是用于GC且可用的Heap size不足2%的时候将抛出此异常该错误常见场合:
Web上传文件时
开启大型文件或从数据库一次取了太多的数据
编码基本规范: https://blog.****.net/y13156556538/article/details/70045656