JVM内存区

内存区分类

线程私有:

  1. 程序计数器(Program Counter Register) 程序计数器是一块较小的内存区域,它是线程私有的,用于记录当前线程执行的字节码地址或正在执行的指令地址。当线程执行Java方法、Native方法或者普通的Java代码时,程序计数器都会有相应的变化。
  2. Java虚拟机栈(JVM Stack) Java虚拟机栈也是线程私有的,用于存储方法调用时的局部变量、中间结果和方法执行完毕后恢复现场需要的信息。每个方法在执行时都会创建一个栈帧,栈帧中包含了方法的返回地址、局部变量表和操作数栈等内容。
  3. 本地方法栈(Native Method Stack) 与Java虚拟机栈类似,本地方法栈主要用于存储Native方法的局部变量、中间结果和执行信息。

线程共享:

  1. (Heap) 堆是Java虚拟机中最大的一块内存区域,用于存放Java对象实例。堆空间可以动态调整大小,通过GC来回收没有被引用的对象。更多GC回收算法可以参考我的另一篇博客:JVM内存回收机制_源末coco的博客-CSDN博客
  2. 方法区(Method Area) 方法区用于存储已被JVM加载的类信息、常量池、静态变量、即时编译器编译后的代码等内容。方法区也可以动态调整大小,但是相对于堆空间而言,它的调整频率较小。
  3. 运行时常量池(Runtime Constant Pool) 运行时常量池是Java虚拟机为每个类和接口维护的一个常量池,用于存放编译期生成的常量数据和符号引用等。与Class文件中的常量池不同,运行时常量池是存放在方法区中的。

在Java 8之后,元空间已经取代了方法区的实现,元空间更加灵活和高效,可以根据需要动态调整大小,并且可以通过HotSpot虚拟机的诊断工具进行监控和管理。元空间还支持字符串去重(String Deduplication)和类共享(Class Sharing)等特性,在一定程度上提升了JVM的性能和响应能力。

常量存放位置:

在Java中,常量是指在程序运行期间不可更改的值,通常用final关键字来修饰。Java中的常量有两种类型:静态常量和实例常量。

静态常量是属于类的常量,在程序启动时被加载到方法区(Method Area),并且一直存在于内存中。因为属于类的常量,所以可以通过类名来访问(例如:ClassName.CONSTANT_NAME)。

实例常量是属于对象的常量,在对象创建时被加载到堆内存(Heap Space)中,并且随着对象的销毁而释放。因为属于对象的常量,所以只能通过对象引用来访问(例如:objectName.constantName)。

无论是静态常量还是实例常量,它们的值都是不可更改的,因此JVM会将其存储在常量池中。常量池是一块位于方法区中的内存区域,用于存储编译期产生的各种字面量和符号引用,包括字符串常量、数字常量、类、方法和字段的符号引用等等。常量池中的常量在程序运行期间一直存在于内存中,并且可以被多个对象共享,因此节省了内存空间。

总结:Java中的常量会存储在常量池中,而常量池是位于方法区中的一块内存区域,用于存储编译期产生的各种字面量和符号引用。通过将常量存储在常量池中,可以在程序运行期间节省内存空间,并提高程序的执行效率。

你可能感兴趣的:(jvm,java,开发语言)