jvm堆、栈、String常量池
2024-08-29 05:41:13
原文地址:http://blog.csdn.net/tophawk/article/details/78704074
- 程序计数器:它的生命周期与线程相同,线程私有。较小的内存区域,用以完成分支、循环、跳转、异常处理、线程恢复等基础功能。不会发生内存溢出(OutOfMemory=OOM)错误。
- 虚拟机栈:它的生命周期与线程相同,线程私有。虚拟机栈中存储了方法执行时相关信息,每个方法在调用时都会在虚拟机栈中创建一个方法帧,方法帧中包含了局部变量,参数,运行中间结果等信息。帧数超过限制(-Xss),就会出现StackOverFlow(=SOF)错误。另外超过线程分配的内存大小,也会报OOM错误。
- 本地方法栈:它的生命周期与线程相同,线程私有。基本同虚拟机栈。存放的是native方法帧。可出现SOF和OOM错误。
- 元空间(MetaSpace):所有线程共享。存放class加载相关信息。
- 堆:所有线程共享。存放new出来的数组和对象数据,以及类的静态变量。同时,包含一个常量池(final),是由1.7以前版本的方法区转移过来的。
由图可知:
- str1==str2 指向同一个堆对象,同时创建了一个常量池引用。
- str3 创建了3个堆对象,只创建了一个常量池引用。
- str4 创建了2个堆对象,其中有个对象的value引用另一个的value地址,并未创建常量池引用。
另外补充几点关于String的总结:
- 字面量方式声明,查找常量池有则返回引用。否则,堆里生成对象,同时在在常量池生成引用。如:String s = "xyz";
- 字面量相+,根据+的结果查找常量池有则返回引用,否则,堆里生成对象,同时在常量池生成引用。如:String s = "a"+"b"; 常量池查找“ab”。最多生成三个对象。
- 字符串相+,如果有一个不是字面量,则必在堆里生成一个新对象,常量池不生成引用。如:String s=s1+"a";
最新文章
- Java 基础知识相关好文章
- bat脚本命令循环运行程序 ,然后指定时间退出。
- 正则表达式用户名密码电话身份证Email使用
- UVa 11481 (计数) Arrange the Numbers
- 【转】自定义UITableViewCell控件阻挡回调不到didSelectRowAtIndexPath的解决办法
- 多个线程访问url
- (转载)JavaScript中的原型和对象机制
- linux下mysql配置文件my.cnf详解
- MediaInfo使用简介(新版本支持HEVC)
- Android Service组件(1)
- Flex 百度地图API使用
- 路径中“/” ";\"; ";\\";的区别
- JavaScript插件——模态框
- STM32L476RG_中断开发与实列
- 使用loadrunner编写webservice接口请求
- ModelViewSet 路由 / django logging配置 / django-debug-toolbar使用
- pygame编程之font模块
- jmeter实战1
- DBCP、c3p0、Druid三大连接池区别
- 068——VUE中vuex的使用场景分析与state购物车实例
热门文章
- 别傻傻不知道 == 和 equals 的区别【面试系列】
- java对接微软认证,用oauth2.0实现
- SpringBoot+EventBus使用教程(二)
- spring bean的三种管理方式·
- ReentrantLock和Condition实现生产者和消费者
- Thinkpad S430 3364-A59 (笔记本型号)加内存条过程
- HTML+CSS学习笔记整理
- XmlExtensions帮助类
- swagger 集成后发布到服务器报错[Could not find file 'D:\\home\\site\\wwwroot\\bin\\WebAPI.XML]
- PIE SDK创建金字塔算法