java常量池放在jvm哪个里面 jdk8 string在堆还是栈?

[更新]
·
·
分类:互联网
3681 阅读

jdk8

jdk8 string在堆还是栈?

string在堆还是栈?

java的字符串存储在哪?
对于堆、栈和字符串常量池以及他们之间的关系,我是这样理解的。
首先介绍一下堆、栈、常量池中存放的数据类型吧。
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
堆:存放所有new出来的对象,存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
栈:存放基本数据变量和对象的引用,对象(new出来的对象)本身不存在在栈中,而是存放在堆中或者常量池中(字符串对象存放在常量池中);
常量池:存放基本类型常量和字符串常量。
每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,数据就会自动消失。堆中的对象由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
每个栈中的数据(原始类型和对象引用)都是 私有的,其他栈不能访问。
24.3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

《深入理解Java虚拟机》过时了吗?

其实这个问题需要客观地看待,我认为只要java虚拟机不过时,《深入理解java虚拟机》这本书就不会过时。跑在JVM上的编程语言不止java一种,JPython,JRuby,Groovy等语言都跑在java虚拟机上,存在即合理,只要这些编程语言有人用,java虚拟机就不会过时。很多C和C 的程序员吐槽java虚拟机的GC机制导致跑在JVM上的编程语言写出来的程序性能差,执行慢的缺点。这点我不予否定,GC在垃圾回收时的确会有较长的停顿时间,但是事物总是具有两面性的,需要客观看待,C追求性能,那么就得牺牲可移植性。而java正是在极致性能和跨平台性两者的权衡下选择了后者,而恰恰java虚拟机正是java跨平台的核心所在,况且,JVM也是随着技术的发展不断演进的,从CMS,G1再到java11目前还在试验阶段的ZGC,java虚拟机的GC停顿时间也在变得越来越短,官方给出的ZGC的停顿时间不超过10ms,我们在做性能测试的时候ZGC的停顿时间远远到不了10ms,大多数情况下都在一两毫秒之内,况且10ms的停顿对大多数的程序的性能影响都是微乎其微的,相比于以前四五百毫秒的停顿时间,即使是10ms的停顿也算是几何级的突破了,相信未来的JVM性能还会不断地提升的,所以,在未来的很长一段内,java虚拟机不但不会过时的,反而会更加流行。再说《深入理解java虚拟机》这本书,自出版以来,一直被业界奉为经典之作,也是程序员了解JVM必看的著作,虽然这本书是基于JavaSE7的规范,但是这并不妨碍我们学习JVM.一般底层的核心内容变化的幅度不是很大的。虽然这本书讲到的CMS垃圾收集器目前已放弃维护,官方重点维护G1和ZGC,但是关于原理和思想的东西是永远都不会变的,之所以长期起来被奉为经典,就是因为有其借鉴的价值。所以《深入理解java虚拟机》在未来很长一段时间是不会过时的。