一直有个疑问,java中字符串池,String池,共享池是怎么回事?
好像知道什么意思,但具体又不太清楚,所以也一直没太关注。
从网上看了些资料,解释了下疑问。
在java的栈中,有共享池的概念,把一些常量会放到这个共享池中,包括字符串常量和基本类型常量。
共享的操作时在编译时 由编译器完成的,可以节省内存,并提高效率。
例如语句string str = "hello", 首先在栈中创建字符串引用变量str, 再看看栈中有没有“hello”,如果有就str直接指向它,没有就创建“hello”并放在栈中,然后指向它。
对于int之类的基本类型的变量也差不多都是这样的。
而对于 String str = new String("hello"),则是创建新的对象,并放在堆内存中。是在runtime的时候分配内存的。
这样做效率和节省内存方面不如String str = “hello”, 但是更灵活,如果编译时不知道要创建什么样的字符串,就
只能运行时创建了。
jvm对内存的划分:
堆
栈(分本地方法栈和虚拟机栈)
方法区(常被称为永久代,常量池与class字节码就被加载到这个地方)
常量池是jvm方法区的的一部分
比如java中最简单的一个main方法的运行,.java文件被jdk编译为class文件,再经过jdk的类加载器加载到方法区,这个时候,像代码中的int i = 5;这个5就已经加载到常量池中了,记住一句话,常量是所有线程共用的,这一设计可以极大地节省内存空间。