A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 武汉分校-小舞 黑马粉丝团   /  2017-8-18 15:49  /  3745 人查看  /  50 人回复  /   4 人收藏 转载请遵从CC协议 禁止商业使用本文

在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题。下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文。
1、java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小?
2、String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBuilder低?StringBuffer和StringBuilder有什么联系和区别?
3、java中常量是指什么?String s = “s” 和 String s = newString(“s”) 有什么不一样?
本文经多方资料的收集整理和归纳,最终撰写成文,如果有错误之处,请多多指教!
java内存分配1、 JVM简介
Java虚拟机(Java VirtualMachine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。
游客,如果您要查看本帖隐藏内容请回复
2、 java内存分区
从上节知道,运行时数据区即是java内存,而且数据区要存储的东西比较多,如果不对这块内存区域进行划分管理,会显得比较杂乱无章。程序喜欢有规律的东西,最讨厌杂乱无章的东西。 根据存储数据的不同,java内存通常被划分为5个区域:程序计数器(Program CountRegister)、本地方法栈(Native Stack)、方法区(Methon Area)、栈(Stack)、堆(Heap)。
游客,如果您要查看本帖隐藏内容请回复
在这里可能会有读者表示疑问:记得还有一个什么永久代(PermanentGeneration)的啊,难道它不属于Java堆?亲,你答对了!其实传说中的永久代就是上面所说的方法区,存放的都是jvm初始化时加载器加载的一些类型信息(包括类信息、常量、静态变量等),这些信息的生存周期比较长,GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGenSpace错误。其相关设置参数:
·        -XX:PermSize –设置Perm区的初始大小
·        -XX:MaxPermSize –设置Perm区的最大值
新生代(Young Generation又分为:Eden区和Survivor区,Survivor区有分为FromSpace和To Space。Eden区是对象最初分配到的地方;默认情况下,FromSpace和To Space的区域大小相等。JVM进行Minor GC时,将Eden中还存活的对象拷贝到Survivor区中,还会将Survivor区中还存活的对象拷贝到Tenured区中。在这种GC模式下,JVM为了提升GC效率,将Survivor区分为From Space和ToSpace,这样就可以将对象回收和对象晋升分离开来。新生代的大小设置有2个相关参数:
·        -Xmn — 设置新生代内存大小。
·        -XX:SurvivorRatio — 设置Eden与Survivor空间的大小比例
老年代(Old Generation: 当 OLD 区空间不够时, JVM 会在 OLD 区进行 majorcollection;完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”Out of memory错误”  。
三、String类型的深度解析
游客,如果您要查看本帖隐藏内容请回复

更多图片 小图 大图
组图打开中,请稍候......

50 个回复

倒序浏览
zhangxiaozhan 来自手机 初级黑马 2017-8-19 01:06:20
沙发
红红火火恍恍惚惚什么意思
回复 使用道具 举报
紫薯布丁。。
回复 使用道具 举报

红红火火恍恍惚惚
回复 使用道具 举报
很牛   看看
回复 使用道具 举报
S_m_ith 来自手机 初级黑马 2017-8-27 20:23:16
地板
大家好,我是一个新来的
回复 使用道具 举报
红红火火恍恍惚惚
回复 使用道具 举报
和法规和福建福建高考高防御
回复 使用道具 举报
pamper 来自手机 初级黑马 2017-9-4 00:35:59
9#
,,,,,,,,,,
回复 使用道具 举报
谢谢分享,受益匪浅!
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
kjahkFIUGwfj
回复 使用道具 举报
不听不听 和尚念经
回复 使用道具 举报
激发了附件安莉芳家阿拉法f
回复 使用道具 举报
不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不不
回复 使用道具 举报
cbf 初级黑马 2017-9-14 20:41:18
15#

RE: java内存与String类型详解

java内存与String类型详解
回复 使用道具 举报
java内存与String类型详解
回复 使用道具 举报
写得好呆呆呆呆呆呆呆呆地
回复 使用道具 举报
写的不错,支持一下·
回复 使用道具 举报
啊我也啊也啊啊
回复 使用道具 举报
学习学习
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马