JDK 1.8 JVM的变化
1、移除方法区
JDK 1.7及之前方法区存放的数据有类信息(类名,修饰符,字段描述,方法描述等),常量,静态变量,即时编译后的class文件。
方法区中还包含有常量池:常量池中主要有字面量和符号引用
字面量:文本字符串,声明为final的常量值;
符号引用:包括了三种常量,分别是:类和接口的全限定名,字段的名称和描述符,方法的名称和修饰符。
为什么移除方法区?
1、它在启动时固定大小,很难进行调优,并且FullGC时会移动类元信息
2、类及方法的信息等比较难确定大小,因此对永久代的大小指定比较困难
3、在某些场景下,如果动态加载类过多,容易造成Perm区的OOM。
4、字符串存在方法区中,容易出现性能问题和内存溢出
5、永久代(在GC时用永久代实现方法区)GC垃圾回收效率偏低(回收目标主要是常量池和类型的卸载)
6、永久代的垃圾收集和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集
2、MetaSpace元空间 取而代之
JDK 1.8将方法区中的字符串常量移至堆内存,其他内容如类信息、静态变量、其他常量(如整形常量),即时编译后的class文件等都移动到元空间内。
元空间(MetaSpace)不在堆内存上,而是直接占用的本地内存。因此元空间的大小仅受本地内存限制。也可通过参数来设定元空间的大小
-XX:MetaSpaceSize 初始元空间大小,达到该值就会触发垃圾收集器进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低
该值;如果释放了很少的空间,那么在不超过MaxMetaSpaceSize时,适当提高该值。
-XX:MaxMetaSpaceSize 最大元空间大小,默认没有限制
元空间的特点:
1、每个加载器有专门的存储空间。
2、不会单独回收某个类。
3、元空间里的对象的位置是固定的。
4、如果发现某个加载器不再存活了,会把相关的空间整个回收。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类