博客
关于我
方法区的演进细节
阅读量:749 次
发布时间:2019-03-23

本文共 1126 字,大约阅读时间需要 3 分钟。

方法区的演进细节

1. 概述

方法区是Java虚拟机(JVM)中一个重要的内存区域,主要用于存储类的方法、字段和静态初始块。它在JVM的内存布局中扮演着重要角色,尤其是在垃圾回收和内存管理方面具有特殊意义。

随着时间的推移,方法区的实现经历了多次演变,从最初的永久代到现代的元空间,再到当前的StringTable,每一次变化都为了提升内存利用效率和解决内存碎片问题。

2. 永久代为什么要被元空间替换

在早期的JVM中,方法区采用永久代来存储类信息、方法和静态变量。永久代是一个逻辑上定义的内存区域,它的大小可以通过配置文件指定。然而,随着应用程序规模不断扩大,永久代内存启动失败的问题越发严重,这种内存管理方式也难以应对大规模多线程应用的需求。

因此,JVM开发者选择用元空间来替代永久代。元空间是一个物理内存地址空间,它和堆内存一样是物理内存的一部分,与JVM的内存管理更加紧密。通过这种方式,JVM能够更灵活地管理内存,而降低垃圾回收的复杂性。

3. StringTable为什么要调整

在一些低版本的JVM中,元空间仍然采用StringTable来存储字符串类信息。StringTable最初的设计目的是为了优化字符串的 intern 操作性能,但随着时间推移,它逐渐暴露了内存管理上的缺陷。

为了解决这些问题,JVM开发者对StringTable进行了重新设计,使其能够更高效地管理字符串数据。新的设计保留了intern操作的特性,但通过更优化的内存布局和垃圾回收机制,显著提升了内存利用效率。

4. 静态变量放在哪里

在现代JVM中,静态变量(static variables)并不会被放置在方法区中,而是直接存储在堆内存中。这种设计让静态变量能够与类的实例变量一起被垃圾回收,只要相应的引用被销毁,静态变量也会随之释放内存资源。

此外,静态变量可能还会被放置在不同的内存区域中,具体取决于JVM的实现细节。在有些实现中,它们可能位于方法区的特定内存区域;在其他实现中,则可能与堆内存的其他部分一起管理。

stringtable在当前的jvm中的作用

在某些现代JVM中,StringTable可能仍然有特定的用途,但它通常不再是默认的配置。在这些实现中,StringTable更多地用于某些性能敏感场景,而不是作为通用的内存管理机制。

总的来说,JVM的内存管理机制经历了从永久代到元空间,再到当前各种复杂的布局的演进过程。这些变化不仅提升了内存利用效率,也为现代应用程序的性能提供了更强有力的支持。

通过非标准化的方法区实现方式,JVM能够更好地应对多核处理器、大内存以及高并发需求。这种可编程性和灵活性也是当前JVM优势的重要体现。

转载地址:http://mkxzk.baihongyu.com/

你可能感兴趣的文章
学习Vue.js2.0(国外视频教程)
查看>>
ubuntu 16.04 镜像下载
查看>>
CUDA9.1、cuDNN7在Ubuntu16.04上的安装
查看>>
微信小程序云开发:怎么删除云函数?已解决
查看>>
解决微信小程序项目导入的问题:app.json 未找到、 __wxConfig is not defined
查看>>
非迅捷|PDF、Word、PPT、Excel、图片等互相在线转换:免费、简单、快速、零错误、无套路
查看>>
PyCharm配置anaconda环境
查看>>
查找最小值栈的O(1)
查看>>
Java面试题整理,闭关在家37天“吃透”这份345页PDF,纯干货
查看>>
概念唱片Plastic Beach封面高清壁纸
查看>>
LINUX-WIFI无线接入的一些东西
查看>>
word文档手写字母总会大写问题
查看>>
Redis中的key
查看>>
Spring 和 DI 依赖注入
查看>>
laravel server error 服务器内部错误
查看>>
iJ配置Maven环境详解
查看>>
面试题 08.01. 三步问题
查看>>
剑指 Offer 11. 旋转数组的最小数字
查看>>
作为我的第一篇csdn博客吧
查看>>
一道简单的访问越界、栈溢出pwn解题记录
查看>>