JVM内存模型及String对象内存分配
昨天看了一篇关于《Java后端程序员1年工作经验总结》的文章,其中有一段关于String和StringBuffer的描述,对于执行结果仍然把握不准,趁此机会也总结了下JVM内存模型。
1、JVM运行时数据区域
关于JVM内存模型之前也了解过一些,也是看过就忘,好记性比如烂笔头,记下来吧。参考此文章http://chenzhou123520.iteye.com/blog/1585224
图1 JVM运行时数据区域
JVM Stack 异常情况:
StackOverflowError:当线程请求分配的栈容量超过JVM允许的最大容量时抛出
package com.xtli.controller;public class StringTest {public static void main(String[] args) {String s1 = "hello";String s2 = "world";System.out.println(s1+"---"+s2);//1:hello---worldchange(s1,s2);System.out.println(s1+"---"+s2);//3:hello---worldStringBuffer sb1 = new StringBuffer("hello");StringBuffer sb2 = new StringBuffer("world");System.out.println(sb1+"---"+sb2);//4:hello---worldchange(sb1,sb2);System.out.println(sb1+"---"+sb2);//6:hello---worldworld}public static void change(String s1, String s2) {s1 = s2;s2 = s1+s2;System.out.println("change(s1,s2)---"+s1+"---"+s2);//2:change(s1,s2)---world---worldworld}public static void change(StringBuffer sb1, StringBuffer sb2) {sb1 = sb2;sb2.append(sb1);System.out.println("change(sb1,sb2)---"+sb1+"---"+sb2);//5:change(sb1,sb2)---worldworld---worldworld}
}
对以上代码进行分析说明,如下
public class StringTest {public static void main(String[] args) {//在main方法的栈中创建引用s1和引用s2,此引用s1和引用s2存放在栈(main方法的栈)中;编译时,在常量池中创建两个常量"hello"和"world",s1和s2分别//指向两个常量String s1 = "hello";String s2 = "world";System.out.println(s1+"---"+s2);//1:hello---worldchange(s1,s2);//引用s1和s2作为参数传递到change方法中//change方法中的引用s1,s2和main方法中的引用s1,s2存放地址并不同,以下输出的是main方法栈中的s1和s2,并没有发生变化,故代码3有以下输出System.out.println(s1+"---"+s2);//3:hello---world//以下两行代码将会在main方法栈中创建引用sb1和sb2,并在堆内存中创建两个对象"hello"和"world",sb1和sb2分别指向两个对象StringBuffer sb1 = new StringBuffer("hello");StringBuffer sb2 = new StringBuffer("world");System.out.println(sb1+"---"+sb2);//4:hello---worldchange(sb1,sb2);//引用sb1和sb2作为参数传递到change方法中//main方法中的sb1所指向的堆内存地址未发生变化,故仍为"hello",而change(sb1,sb2)方法改变了main方法中sb2所指向的堆内存地址的内容,故代码6有以下输出System.out.println(sb1+"---"+sb2);//6:hello---worldworld}public static void change(String s1, String s2) {//在change方法的栈中创建引用s1和s2,并指向常量池中的常量s1 = s2;//将引用s1指向s2的常量池中的"world"s2 = s1+s2;//在堆内存中创建"worldworld"对象,并将s2指向此堆内存地址System.out.println("change(s1,s2)---"+s1+"---"+s2);//2:change(s1,s2)---world---worldworld}public static void change(StringBuffer sb1, StringBuffer sb2) {//在change方法的栈(和上面的change方法栈不同)中创建引用sb1和sb2,并指向main方法栈中sb1和sb2所指向的对象sb1 = sb2;//将引用sb1指向sb2所引用的对象"world"sb2.append(sb1);//引用sb2所指向的对象发生变化,变为"worldworld",注意此时外部main方法中的sb2和此方法中的sb1均指向此堆内存地址,//此地址内容发生变化后,外部main方法中的sb2指向的内容也跟着变化System.out.println("change(sb1,sb2)---"+sb1+"---"+sb2);//5:change(sb1,sb2)---worldworld---worldworld}
}
为了进一步说明change(String s1, String s2)中的结果,可以进行以下验证。
public static void change(String s1, String s2) {String s= "world";String ss= "worldworld";s1 = s2;System.out.println(s==s1);//输出trues2 = s1+s2;System.out.println(ss==s2);//输出falseSystem.out.println("change(s1,s2)---"+s1+"---"+s2);//2:change(s1,s2)---world---worldworld}
JVM内存模型及String对象内存分配相关推荐
- java内存模型 创建类_JVM内存模型及String对象内存分配
昨天看了一篇关于<Java后端程序员1年工作经验总结>的文章,其中有一段关于String和StringBuffer的描述,对于执行结果仍然把握不准,趁此机会也总结了下JVM内存模型. 1. ...
- String 对象内存分配策略
这个问题可以说是一个高频的面试题目,以前把这个问题弄懂了,最近突然想到这个问题,一时间竟然没有太好的思路了.所以花些时间整理一下其中的知识点. 一.内存分配策略 我们先来看一个题目(这个问题都快看吐了 ...
- 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!
现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...
- Java内存模型和常见的内存溢出类型及解决方案
Java内存模型与常见的内存溢出 一. Java 运行过程和内存分配 1 Java的平台无关性 2 Java内存模型 2.1Java内存模型图 3 内存结构详解 3.1 元空间(MetaSpace) ...
- (五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
引言 在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内.而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程.J ...
- java jvm内存模型_Java(JVM)内存模型– Java中的内存管理
java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...
- jvm内存模型和java内存模型_JVM运行时内存模型综述
JVM内存模型 JVM分为五个区域:虚拟机栈.本地方法栈.方法区.堆.程序计数器. JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小. JVM五个区中虚拟机栈.本地方法栈.程序计数器 ...
- jvm内存模型_JVM基础:内存模型
本篇主要从JVM的内存模型和堆内存详解两个角度整理. 内存模型 JVM中的根据应用使用数据的特性把内存划分为若干个区,根据线程使用的方式可以粗略的分为堆区和栈区,堆区即线程共享的部分(这里的堆区一般指 ...
- java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...
在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...
- 我出题,你来算。根据Flink TaskManager内存模型,各部分内存分配?
点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 大数据面试提升私教训练营 Hi,我是王知无,一个大数据领域的原创作者. 放心关注我,获取更多行业的 ...
最新文章
- java 下载文件功能代码例子
- 算法-------二分法查找
- scanf函数详解与缓冲区
- Linux运行可执行文件
- Kafka中副本机制的设计和原理
- 使用spring jdbc的batchUpdate功能提高性能
- 台式计算机睡眠了怎么唤醒,台式电脑睡眠了怎么唤醒
- 使用Chrome谷歌浏览器打开Axure原型图
- yolo系列之yolo v3【深度解析】
- 十一条Python学习路线,推荐收藏
- linux搭建pptpd服务器,最简单的Linux系统上的pptpd服务器安装
- Uboot11之主Makefile分析2
- 网络天才网页中文版_【在线猜谜类网页游戏】网络天才网页版在线玩
- 计算机网络实验一、验证性实验
- Excel日期修改为统一月份
- 【C进阶】qsort函数详解
- 【软件工程实践】Hive研究-Blog10
- Multisim仿真—整流滤波电路(二)
- 计算机毕业设计之SpringBoot+Vue.js工会管理系统 工会管理平台
- NLP中的关系抽取方法归纳
热门文章
- Matlab趋势线公式引用,批量提取excel中图表趋势线的公式中的斜率 - 程序语言 - 小木虫 - 学术 科研 互动社区...
- Python_随机生成11位手机号
- 不登录复制 CSDN代码
- 教育部取消计算机语言,《永远不要说你已经尽力了》--清华生的讲座报告【转】...
- 新版FMEA软件:特殊特性自动分类 免费申请试用(FMEAHunter)
- 使用Spring Boot开发邮件系统
- 2017年编程语言排名
- spoon在linux上运行,kettle在linux上运行
- windows通过注册表修改IP
- geotools绘制地图导出图片