JVM中易混淆的概念和疑问
1)方法区和永久代
-
方法区不等于永久代
-
方法区和永久代的关系很像 Java 中接口和类的关系,类实现了接口。永久代是 HotSpot 的概念,方法区是 Java 虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现,其他的虚拟机实现并没有永久代这一说法
-
可以类比JVM和HotSpot:Jvm是规范,而HotSpot是Jvm概念的一个实现
-
目前有三大虚拟机:HotSpot,oracle JRockit,IBM J9
2)永久代为什么要被元空间替换?
-
因为永久代设置空间大小是很难确定的,再某些场合下,如果动态加载的类过多,容易产生Permanent区的OOM(内存溢出)。比如实际Web工程中,因为功能点较多,运行过程中,要不断动态加载很多类,经常出现致命错误
-
同时对永久代的调优是很困难的
-
元空间和永久代最大的区别是:元空间并不在虚拟机中,而是使用本地内存。因此默认情况下,元空间的大小仅受本地内存限制
3)JDK8及以后,为什么要指定元空间大小?
-
和永久代不同,如果不指定大小,默认情况下,虚拟机会耗尽所有可用的系统资源内存,如果元空间发生溢出,虚拟机一样会抛出异常OutOfMemoryError:Metaspace
-
元空间大小可以使用参数 -XX:MetaspaceSize 和 -XX:MaxMetapaceSize指定
-
默认值依赖于平台,windows下, -XX:MetaspceSize是21M, -XXMaxMetaspaceSize的值是 -1,即没有限制
-
-XX:MetaspceSize:设置元空间大小,对于一个64位的服务器端JVM来说,默认的-XX:MetaspceSize值为21MB。这就是初始化的高水位线,一旦触及着水位线,Full GC就会被触发,开始卸载没有用的类
4)常量池主要可以分为以下几种
-
1.静态常量池:即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串/数字这些字面量,还包含类、方法的信息,占用class文件绝大部分空间。class常量池是在编译后每个class文件都有的。这种常量池主要用于存放两大类常量:字面量和符号引用量,字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等;符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:类和接口的全限定名、字段名称描述符、方法名称描述符。类的加载过程中的链接部分的解析步骤就是把符号引用替换为直接引用,即把那些描述符(名字)替换为能直接定位到字段、方法的引用或句柄(地址)。
-
2.运行时常量池:虚拟机会将各个class文件中的常量池载入到运行时常量池中,即编译期间生成的字面量、符号引用,总之就是装载class文件。每个类都有一个运行时常量池
-
3.字符串常量池 :字符串常量池可以理解为运行时常量池分出来的部分。加载时,对于class的静态常量池,如果字符串会被装到字符串常量池中。
-
4.整型常量池:Integer,类似字符串常量池,可以理解为运行时常量池分出来的。加载时,对于class的静态常量池装的东西,如果是整型会被装到整型常量池中。
类似的还有Character、Long等等常量池(基本数据类型没有哦)。。。(ps:整型常量池也可以理解为一个缓存Integer.Cache存放[-128,127])
5) 运行时常量池和静态常量池的关系
-
运行时常量池中的常量,基本来源于各个class文件中的常量池(静态常量池)。
-
程序运行时,除非手动向常量池中添加常量(比如调用intern方法),否则jvm不会自动添加常量到常量池
-
以上所讲仅涉及字符串常量池,实际上还有整型常量池、浮点型常量池等等,但都大同小异。
只不过数值类型的常量池不可以手动添加常量,程序启动时常量池中的常量就已经确定了。
比如整型常量池中的常量范围:[-128~127],只有这个范围的数字可以用到常量池。
6)静态常量池中主要包含哪些信息?
主要用于存放两大类常量:字面量和符号引用量
7)字符串常量池是全局的吗?两个不同类中相同的字符串常量是否存储在同一个String constant pool?
-
JVM中字符串常量池被所有类共享
-
两个不同类中相同的字符串常量确实是否存储在同一个String constant pool,看下图例子:
参考链接:
https://www.zhihu.com/question/451498490/answer/2413447781
https://blog.csdn.net/Hicodden/article/details/115997210
https://blog.csdn.net/weixin_42246401/article/details/114181125
https://blog.csdn.net/m764395448/article/details/109407220
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
2021-07-09 多线程状态