当前位置:首页 > 虚拟机 > 正文

java虚拟机中常量存储在哪里(java虚拟机占用内存是动态的吗)

Java中String类型的存储位置

ing在堆上创建字符串对象。
当调用intern()方法时,
编译器将字符串添加到常量池中(stringTable维护),
并返回常量的引用。
2.当通过文字赋值创建字符串时(例如Stringstr="twm"),
将首先查看常量池中是否存在该字符串。如果存在,则栈中的引用直接指向该字符串;
如果不存在,则在常量池中创建一个字符串,然后栈中的引用指向该字符串。
3.字符串常量的“+”操作在编译阶段会直接编译成字符串。
例如:stringstr="JA"+"VA",
在编译阶段会直接合并到语句Stringstr="JAVA"中,
然后会进入持久化组来查找“JAVA”是否存在。创建或引用。
4.对于最终字段,常量替换是在编译时直接执行的(而对于非最终字段,则在运行时执行赋值)。
finalStringstr1="ja";
finalStringstr2="va";
Stringstr3=str1+str2;
编译时直接替换成Stringstr3="ja"+"va”,根据第三条规则,
替换为Stringstr3="JAVA"
5.连接常量字符串和变量时(如:Stringstr3=baseStr+“01”;)
会调用()在堆上创建一个新对象
1.7之后,第一个intern方法仍然会检查常量组中是否存在。
如果存在,则返回常量组中的引用,这与之前不同,不同的是,如果在常量组中没有找到对应的匹配字符串,则不会将该字符串复制到常量组中,而是复制到常量组中。常量组中会创建一份原字符串的副本,简单来说,就是平常放在常量区的内容发生了变化
当在常量池中找不到时,就制作一份副本,放入常量区中常量池,1.7版本以后,堆上的地址引用被复制到常量池中。。
例如:
Stringstr2=newString(“str”)+newString(“01”);
();
Stringstr1="str01";
n(str2==str1);
在JDK1.7中,当();执行时,
因为常量池中没有字符串“str01”,所以会在常量池中创建一个对堆中“str01”的引用
(注意这是一个引用,这个这是它与JDK1.6的区别,在JDK1.6中是创建原始字符串的副本),
在做Stringstr1="str01";时字面赋值,常量池中已经存在引用,所以直接返回引用,因此str1和str2都指向堆中的同一个字符串,并返回true。
Stringstr2=newString(“str”)+newString(“01”);
Stringstr1=“str01”;
();
n(str2==str1);
交换中间两行的位置后,因为在进行文字赋值时(Stringstr1="str01"),
不存在,所以str1指向常量空间中的一个位置,str2指向堆中的一个对象。
intern方法执行时,不会影响str1和str2,因此返回false。

关于Java虚拟机的一些注意事项

程序计数器:当前线程正在执行的字节码行号的指示器。
Java虚拟机栈:描述了Java方法执行的内存模型:每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态引用、方法出口等信息。
原生方法栈:维护虚拟机使用的原生方法。
堆:存储对象的实例。
方法区:用于存储虚拟机已经加载的类信息、常量、静态变量、JIT编译代码等数据。
2.堆中的分区:Eden、survivalfrom、survivalin、老年代,各有特点
Eden区中的对象有生有死,在minorc时会发生。清除Eden区和生存区,并将幸存的对象移动到由老年代保证的另一个生存区。当年轻代中的一个对象经历了几个小周期,达到老年代的年龄后,就会被转移到老年代中,而且大的对象不能存储在年轻代中,会直接转移到老年代中。.在保修期内也可能会损坏。进入老年
3.对象创建方法、对象内存分配、对象访问位置
1对象创建涉及三个步骤:①何时检测到一个新命令,此时检查常量池中是否存在对该对象符号的引用。如果不存在,则将加载该类。否则,执行下一步②。分配内存,所有分配的内存都会被清除。③对虚拟机进行必要的设置,比如设置哈希码、gc分代年龄等,此时会执行命令。执行前,所有字段均为0。执行命令后,安装程序将被初始化。
2:对象内存分配:包括对象头、实例数据、对齐填充。
①对象头:包括对象哈希码、GC分代年龄、锁定状态标志等。
②实例数据:即初始化后对象字段的内容,包括父类的字段等。
③对齐填充:对象的地址为8字节,虚拟机要求对象的大小是对象的整数倍(1倍或2倍)。所以会有一个空白的地方

Java基本数据类型是如何存储在栈上的?

1.所有基本数据类型都存储在栈上,速度很快。2、对于一个对象来说,它的实体存储在堆中,它的引用存储在栈中。
2
示例:Stringstr=newString("123");这个str在栈上,它的对象“123”在堆上。str指向“123”;3、对于对象本身来说,如果它的所有属性的值都不是单例或者静态的,那么它们都存储在堆中。一个类的所有对象的属性值都在堆中,占用不同的内存空间,而一个类的方法只占用方法区一处,所有对象都指向同一个方法区。