zoukankan      html  css  js  c++  java
  • string字符串常量池在内存中的位置

    这里仅仅是举个简单的样例说明字符串常量池在内存中的位置。

        闲言少叙,直接上代码。

     

    Java代码  收藏代码
    1. <span style="font-size: large;">import java.util.ArrayList;  
    2.   
    3. public class Test {  
    4.   
    5.     public static void main(String[] args) {  
    6.         String str = "abc";  
    7.         char[] array = {'a''b''c'};  
    8.         String str2 = new String(array);  
    9.         //使用intern()将str2字符串内容放入常量池  
    10.         str2 = str2.intern();  
    11.         //这个比較用来说明字符串字面常量和我们使用intern处理后的字符串是在同一个地方  
    12.         System.out.println(str == str2);  
    13.         //那好,以下我们就拼命的intern吧  
    14.         ArrayList<String> list = new ArrayList<String>();  
    15.         for (int i = 0; i < 10000000; i++) {  
    16.             String temp = String.valueOf(i).intern();  
    17.             list.add(temp);  
    18.         }  
    19.     }  
    20. }</span>  

     

    运行一下,会怎么样?

    true
    Exception in thread "main" java.lang.OutOfMemoryError: PermGen space
            at java.lang.String.intern(Native Method)
            at Test.main(Test.java:16)
    Java Result: 1  

     

         异常信息告诉我们PermGen 满了。奥,我知道字符串常量池在哪了。PermGen就是jvm规范中所谓的方法区。

         这里偷懒了一下,仅仅是指定了非常大的数10000000让PermGen 溢出。只是时间可能长点。勤快的人还是自己指定java执行的内存比較好,稍小点就能验证。

  • 相关阅读:
    vue系列---响应式原理实现及Observer源码解析(七)
    学习Lowdb小型本地JSON数据库
    渐进式web应用开发---Service Worker 与页面通信(七)
    webpack4核心模块tapable源码解析
    electron 创建托盘应用
    运维堡垒机开发
    使用Supervisord软件管理go服务进程
    安装Harbor之http版本
    Ubuntu 18 LTS netplan 网络配置
    用GO开发企业级分布式云存储系统
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7096591.html
Copyright © 2011-2022 走看看