Java内存区域

这里写图片描述

程序计数器

指示当前线程的字节码执行的行号。
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;
如果正在执行的是Native方法,这个计数器值则为空(Undefined)。
此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

虚拟机栈

每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
常说的“栈”是指虚拟机栈中的局部变量表。

本地方法栈

为虚拟机执行Native方法服务。

堆中的垃圾回收

方法区

存放虚拟机加载类的相关信息,类、静态变量和常量。

运行时常量池

存放编译期生成的各种字面量和符号引用,这部分信息将在类加载后存放到方法区的运行时常量池中。


PS:
- 字面量:string str=”hello world”;//str为变量,hello world为也字面量
- 符号引用:
对于符号引用
在类加载层面上
当一个类被加载时该类所用到的别的类的符号引用都会保存在常量池,实际代码执行的时候首次遇到某个别的类时,JVM会对常量池的该类的符号引用展开转为直接引用。这样下次再遇到同样的类型时JVM就不再解析而直接使用这个已经被解析过的直接引用。
对于源码级别来说
就是依照引用的解析过程来区别代码中某些数据属于符号引用还是直接引用。

System.out.println("test" + "abc");//这里发生的效果相当于直接引用

String s = "abc";
System.out.println("test" + s);//这里的发生的效果相当于符号引用,即把s展开解析,也就相当于s是"abc"的一个符号链接也就是说在编译的时候class文件并没有直接展开s而把这个s看作一个符号,在实际的代码执行时才会展开这个s

运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java虚拟机并不要求常量只能在编译期产生,也就是并非预置入Class文件常量池的内容才能进入方法区的运行时常量池中,运行期间也可将新的常量放入常量池中。
比如:String的intern()
public String intern()

返回字符串对象的规范化表示形式。
一个初始时为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值