0
点赞
收藏
分享

微信扫一扫

Java的内存溢出和内存泄露

正义的杰克船长 2022-04-13 阅读 103
后端java

Java的内存溢出和内存泄露

1.内存溢出?内存泄漏?

2.内存溢出(OutOfMemoryError)

2.1堆内存溢出

这部分内存主要是用来存储new出来的对象的信息(而它的引用就是它的地址信息,存储在虚拟机栈的局部变量表中,题外话!)

java.lang.OutOfMemoryError: Java heap space ->这是最常见的内存溢出问题,

  • 对于这类问题解决可以通过检查代码,是否出现循环new语句,可以通过一些分析工具来检测各个类的内存占用情况来判断

  • 也可以扩大堆区存储可以添加JVM参数 -Xms(初始堆内存)和-Xmx(最大堆内存)

2.2栈内存溢出

这里栈的溢出不是OOM而是java.lang.StackOverflowError,

  • 对于栈的溢出主要是因为程序死循环或者发生递归深度过大(即未设置递归结束条件)
  • 或者栈大小设置过小,可以通过JVM参数-Xss来设置栈的大小

2.3方法区内存溢出

方法区主要存放的是Class类信息和静态变量(引用在方法区,但是信息存放在堆中),如果存放过多的类或者采用cglib代理会产生大量的Class信息在方法区,使得空间溢出

  • 方法区溢出可以通过设置方法区大小参数 ,这里需要注意1.6之前方法区是使用永久代实现,1.7时StringTable(字符串常量池)和静态变量放入了堆中,1.8方法区通过元空间来实现,在直接内存中存放,使用系统内存来尽可能防止方法区溢出
  • -XX:MetaspaceSize 来设置默认大小 -XX:MaxMetaspaceSize=-1表示没有限制
  • 设置初始大小时,对于一个64位的服务器端JVM来说,其默认的21MB,初始高水位线,一旦触及,就会发生Full GC,然后高水位线重置,新的值取决于GC后释放了多少元空间,如果释放的不多就升高高水位线,如果释放的很多,就降低该值
  • -XX:MaxMetaspaceSize最大大小

3.内存泄漏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaqgL0mQ-1649677501692)(C:\Users\Administrator\Downloads\uTools_1649676968607.png)]

由图可以看出,当一些类不需要使用时,会断开链接,但是其中有一条没有断开(Forgotten Reference),这里就会导致Memory Leak

3.1单例模式

单例的生命周期和应用程序时一样长的,如果持有对外部对象的引用的话,那么这个外部对象就不能被回收,这样就导致了内存泄漏

3.2未close()一些资源

的话,那么这个外部对象就不能被回收,这样就导致了内存泄漏

3.2未close()一些资源

例如数据库连接,网络连接和io连接必须手动close,否则不能被回收的

举报

相关推荐

0 条评论