JVM的方法区可以实现垃圾回收吗?

方法区和堆一样,都是线程共享的内存区域,被用于存储已被虚拟机加载的类信息、即时编译后的代码、静态变量和常量等数据。

根据Java虚拟机规范的规定,方法区无法满足内存分配需求时,也会抛出OutOfMemoryError异常,虽然规范规定虚拟机可以不实现垃圾收集,因为和堆的垃圾回收效率相比,方法区的回收效率实在太低,但是此部分内存区域也是可以被回收的。

方法区的垃圾回收主要有两种,分别是对废弃常量的回收和对无用类的回收。

当一个常量对象不再任何地方被引用的时候,则被标记为废弃常量,这个常量可以被回收。

方法区中的类需要同时满足以下三个条件才能被标记为无用的类:

  • Java堆中不存在该类的任何实例对象;
  • 加载该类的类加载器已经被回收;
  • 该类对应的java.lang.Class对象不在任何地方被引用,且无法在任何地方通过反射访问该类的方法。

当满足上述三个条件的类才可以被回收,但是并不是一定会被回收,需要参数进行控制,例如HotSpot虚拟机提供了-Xnoclassgc参数进行控制是否回收。

END

如果觉得有收获,记得关注、点赞、转发。

原文发布于微信公众号 - JavaQ(Java-Q)

原文发表时间:2018-02-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏何俊林

面试常问点:深入剖析JVM的那些事

Class文件结构 -> JVM内存模型 -> 类加载器 -> 类加载过程 -> 类的引用方式 -> 内存分配策略 -> GC -> 对象的引用类型 -> 类卸...

1062
来自专栏软件开发 -- 分享 互助 成长

sizeof(数组)

这里就不讨论一般的数组长度计算了,只说明一下任何数据到了函数的形参中都将退化为指针,所以计算大小的时候,也是计算的指针的大小 直接上代码了 1 // clas...

2888
来自专栏pydata

J2EE复习

JVM的两个内存:      运行时数据区 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区...

852
来自专栏日常分享

Java 垃圾回收机制(早期版本)

Java 垃圾回收机制在我们普通理解来看,应该视为一种低优先级的后台进程来实现的,其实早期版本的Java虚拟机并非以这种方式实现的。

941
来自专栏Java成长之路

一、JVM内存区域详解

Java中虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为若干不同的数据区域。下面来介绍几个运行时数据区域。

2141
来自专栏云霄雨霁

Java虚拟机--内存区域划分

1544
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列11

Java面试系列11 1 Java中的异常处理机制的简单原理和应用 当JAVA 程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。...

3678
来自专栏Android常用基础

粗谈Java虚拟机之内存管理

线程私有,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息...

1062
来自专栏互联网杂技

javascript垃圾收集机制与内存泄漏详解

javascript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中的使用的内存。而在C和C++之类的语言中,开发人员的一项基本任务就是手动跟踪...

40310
来自专栏JAVA高级架构

Java常见面试题及答案 11-20(JVM)

11.JVM内存分哪几个区,每个区的作用是什么? java虚拟机主要分为以下一个区: 方法区: 1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表...

5289

扫码关注云+社区

领取腾讯云代金券