JVM方法区总结

1.栈、堆、方法区交互关系
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
2.方法区的理解
1.一块独立于java堆内存的区域
2.是线程共有的区域
3.和堆一样,可以设置方法区的内存大小
4.也会有内存溢出的异常.比如:加载了过量的第三方jar包,在tomcat下部署了过多的工程.定义了太多的类.
5.当关闭JVM时,会释放方法区的内存区域.

3.HotSpot中方法区的演进
在jdk及以前,习惯把方法区称为永久代,jdk8开始,元空间取代了永久代. 元空间和永久代的最大区别是:元空间不在jvm设置的内存中,而直接使用计算机的内存.
相对于现在的元空间,以前的永久代更容易发生OOM.

4.设置方法区大小与OOM
方法区大小不是固定的,jvm可以根据应用动态调整:

JDK7及以前:通过-XX:PermSize 来设置永久代初始分配空间,默认值是20.75M.
		     -XX:MaxPermSize来设定永久代最大可分配空间。
		     如果JVM加载的类信息容量超过了这个值,会报OOM:PermGenspace
 JDK8及以后:-XX:MetaspaceSize   windows下初始为21M,最大是-1即没有限制		 
					  -XX:MaxMetaspaceSize
	 如果不指定大小,虚拟机耗用所有可用系统内存,元数据区发生溢出,一样OOM:Metaspace

5.如何解决OOM
1.要解决OOM或heap space异常,一般的手段是通过内存映像分析工具,对dump出来的堆转存储快照进行分析,重点确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄露,还是内存溢出.
2.如果是内存泄露,可进一步通过工具查看泄露对象到GC Roots的引用链,于是就能找到内存泄露对象时通过怎样的路径与GC Roots相关联,导致垃圾收集器无法自动回收他们。根据引用链信息,可以较准确的定位出泄露代码的位置.
3.如果不存在内存泄露,或者说内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(-Xmx与-Xms),与物理机器内存对比是否还可以调大,从代码检查是否某些对象生命周期过长,持有状态时间过长,尝试减少程序运行时的内存耗用.

6.方法区的演进细节

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
永久代为什么被元空间替换?
1.由于类的元数据分配在本地内存中,元空间的最大可分配空间就是系统的可用内存空间
2.为永久代设置空间大小很难确定,在某些场景下,如果动态加载类过多,就容易产生OOM
3.而元空间并不在虚拟机中,而是使用本地内存,因此默认情况下,元空间的大小仅受本地内存限制
4.对永久代进行调优是很困难的

7.方法区的垃圾回收
常量池中废弃的常量:HotSpot对常量池的回收策略很明确,只要常量池中的常量没有被任何地方引用,就可以被回收,回收废弃常量与回收Java堆中对象非常类似.
不再使用的类型回收:需要满足三个条件:1.该类的所有实例被回收(包括其派生类)2.该类的类加载器被回收3.无法在任何地方通过放射访问到该类的方法.
方法区内常量池中主要存放的两大类常量:字面量:跟同ava中的字符串常量,用final修饰的变量等. 符号引用:属于编译原理的概念:类和接口的全限定名,字段的方法和描述符,方法的名称和描述符.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值