## 方法區

### 運行時常量池
## 字符串在JVM中如何存放?
方法區是一個邏輯規范,運行時常量池屬于方法區。但是在物理存儲上存在爭議:
### 版本1:常量池在堆中(主流)
字符串對象在JVM中可能有兩個存放的位置:`字符串常量池`或`堆內存`。
1. 使用常量字符串初始化的字符串對象,它的值存放在字符串常量池中;
2. 使用字符串構造方法`new String()`創建的字符串對象,它的值存放在堆內存中;
String提供了一個API, java.lang.String.intern(),這個API可以手動將一個字符串對象的值轉移到字符串常量池中。
在1.7之前,字符串常量池是在PermGen區域,這個區域的大小是固定的——不能在運行時根據需要擴大,也不能被垃圾收集器回收,因此如果程序中有太多的字符串調用了intern方法的話,就可能造成OOM。
在1.7以后,字符串常量池移到了堆內存中,并且可以被垃圾收集器回收,這個改動降低了字符串常量池OOM的風險。
> ?我有問題:這塊內容存在一定的爭議。
### 版本2:常量池移到元空間,使用直接內存
JDK1.8中方法區實現改成了元空間,字符串常量池直接放到了直接內存,但是運行時常量池物理上還是在堆區,雖然物理存放的地方變了,邏輯上看元空間、運行時常量池還是屬于方法區。
[查看出處](https://www.zhihu.com/question/300075241/answer/519570351)
- 前言
- 第一部分 計算機網絡與操作系統
- 大量的 TIME_WAIT 狀態 TCP 連接,對業務有什么影響?怎么處理?
- 性能占用
- 第二部分 Java基礎
- 2-1 JVM
- JVM整體結構
- 方法區
- JVM的生命周期
- 堆對象結構
- 垃圾回收
- 調優案例
- 類加載機制
- 執行引擎
- 類文件結構
- 2-2 多線程
- 線程狀態
- 鎖與阻塞
- 悲觀鎖與樂觀鎖
- 阻塞隊列
- ConcurrentHashMap
- 線程池
- 線程框架
- 徹底搞懂AQS
- 2-3 Spring框架基礎
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高級編程
- Socket與NIO
- 緩沖區
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 認證授權
- 第四部分 數據存儲
- 第1章 mysql篇
- MySQL主從一致性
- Mysql的數據組織方式
- Mysql性能優化
- 數據庫中的樂觀鎖與悲觀鎖
- 深度分頁
- 從一條SQL語句看Mysql的工作流程
- 第2章 Redis
- Redis緩存
- redis key過期策略
- 數據持久化
- 基于Redis分布式鎖的實現
- Redis高可用
- 第3章 Elasticsearch
- 全文查詢為什么快
- battle with mysql
- 第五部分 數據結構與算法
- 常見算法題
- 基于數組實現的一個隊列
- 第六部分 真實面試案例
- 初級開發面試材料
- 答案部分
- 現場編碼
- 第七部分 面試官角度
- 第八部分 計算機基礎
- 第九部分 微服務
- OpenFeign工作原理