- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
先了解下JVM中的内存分配,此处以hotspot vm为例(官方jdk采用的vm) 。
堆内存是各个线程共享的区域 。
它用于存储已经被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据。静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区 。
这里解释一下方法区:
首先方法区不是在堆中,在java8之前是用永久代实现的, 永久代 是 Hotspot 虚拟机特有的概念,虽然 Java 虚拟机规范把方法区描述为堆的一个 逻辑部分 ,但是它却有一个别名叫做 Non-Heap(非堆) ,目的应该是与 Java 堆区分开来 。
java8之后是用元空间实现的,元空间并不在虚拟机中,而是使用本地内存.
只是 JVM 规范 中定义的一个概念,用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 。
。
常量池分为 静态常量池 和 运行时常量池 。
也叫 class文件常量池 ,主要存放编译期生成的各种 字面量(Literal)和符号引用(Symbolic References) .
final类型的常量在编译期间就会进行分配.
静态常量池指的是在编译期确定,保存在class文件中的一些数据.
静态常量池是在编译期间生成的,存储在.class文件中.
。
字面量(Literal)和符号引用量,字面量相当于Java语言层面常量的概念,如文本字符串、声明为final的常量值等 ,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
1、类和接口的全限定名; 。
2、字段的名称和描述符; 。
3、方法的名称和描述符.
当类加载到内存中后,JVM就会将class常量池中的内容存放到运行时常量池中;运行时常量池里面存储的主要是编译期间生成的字面量、符号引用等等.
类加载在链接环节的解析过程,会符号引用转换成直接引用(静态链接)。此处得到的 直接引用 也是放到运行时常量池中的.
运行期间可以动态放入新的常量 。
运行时常量池内存位置:java8之前都在方法区中,java8之后在元空间 。
字符串常量池,也可以理解成运行时常量池分出来的一部分。类加载到内存的时候,字符串会存到字符串常量池里面。利用池的概念,避免大量频繁创建字符串 。
JDK6时字符串常量池位于运行时常量池,JDK7挪到堆中.
Hotspot8之前,使用持久代实现方法区,由于持久代内存不好估算,很容易到值OOM:Perm Gen异常。而元空间是本地内存,取决于操作系统分配内存.
Jdk1.6及之前: 有永久代, 运行时常量池在永久代,运行时常量池包含字符串常量池 。
Jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里 。
Jdk1.8及之后: 无永久代,运行时常量池在元空间,字符串常量池里依然在堆里 。
。
。
参考文章 。
(62条消息) 深入理解java虚拟机(全章节完整)_TJtulong的博客-CSDN博客 。
(62条消息) Java | JVM | 详细图解,坚持看完,带你真正搞懂Java虚拟机_唐 城的博客-CSDN博客 。
(62条消息) Java-双亲委派机制_七楼、的博客-CSDN博客 。
(62条消息) Java-类加载器 11127222 七楼、的博客-CSDN博客 。
(62条消息) jvm中的常量池到底在哪里? 常量池在哪里 yuan_qh的博客-CSDN博客 。
(62条消息) Java方法区和永久代 java永久代和方法区 yuan_qh的博客-CSDN博客 。
这一次,彻底弄懂java中的常量池 - 掘金 (juejin.cn) 。
(62条消息) JAVA常量池,一篇文章就足够入门了。(含图解) lei'chang'liang'chi 河海哥yyds的博客-CSDN博客 。
(62条消息) Java 常量池详解(一)字符串常量池_new hilbert()的博客-CSDN博客 。
彻底搞清楚class常量池、运行时常量池、字符串常量池 - Awecoder - 博客园 (cnblogs.com) 。
。
最后此篇关于JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)的文章就讲到这里了,如果你想了解更多关于JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!