Java基础之jdk1.8 JVM内存模型简述,含String常量池简单分析

高楼大厦,都是平地起的。

整个java体系,其实就一本秘籍,那就是java基础!

就我本人这么多年JAVA研发方面的工作经验来看,基础如果打的扎实,在实际开发工作中会带来极大的助益。

最近有个机会整理JAVA基础相关知识,整理到JVM内存模型这部分的时候,画了两张图,记载在此,供感兴趣的新手参考。

第一张:

JDK1.8 – JVM内存模型说明

《Java基础之jdk1.8 JVM内存模型简述,含String常量池简单分析》

  • 程序计数器:它的生命周期与线程相同,线程私有。较小的内存区域,用以完成分支、循环、跳转、异常处理、线程恢复等基础功能。不会发生内存溢出(OutOfMemory=OOM)错误。
  • 虚拟机栈:它的生命周期与线程相同,线程私有。虚拟机栈中存储了方法执行时相关信息,每个方法在调用时都会在虚拟机栈中创建一个方法帧,方法帧中包含了局部变量,参数,运行中间结果等信息。帧数超过限制(-Xss),就会出现StackOverFlow(=SOF)错误。另外超过线程分配的内存大小,也会报OOM错误。
  • 本地方法栈:它的生命周期与线程相同,线程私有。基本同虚拟机栈。存放的是native方法帧。可出现SOF和OOM错误。
  • 元空间(MetaSpace):所有线程共享。存放class加载相关信息。
  • 堆:所有线程共享。存放new出来的数组和对象数据,以及类的静态变量。同时,包含一个常量池(final),是由1.7以前版本的方法区转移过来的。

第二张:

《Java基础之jdk1.8 JVM内存模型简述,含String常量池简单分析》

由图可知:

  • str1==str2 指向同一个堆对象,同时创建了一个常量池引用。
  • str3 创建了3个堆对象,只创建了一个常量池引用。
  • str4 创建了2个堆对象,其中有个对象的value引用另一个的value地址,并未创建常量池引用。

另外补充几点关于String的总结:

  • 字面量方式声明,查找常量池有则返回引用。否则,堆里生成对象,同时在在常量池生成引用。如:String s = “xyz”;
  • 字面量相+,根据+的结果查找常量池有则返回引用,否则,堆里生成对象,同时在常量池生成引用。如:String s = “a”+”b”; 常量池查找“ab”。最多生成三个对象。
  • 字符串相+,如果有一个不是字面量,则必在堆里生成一个新对象,常量池不生成引用。如:String s=s1+”a”;

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/tophawk/article/details/78704074
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞