jvm里的内存区域

运行时数据区域

 JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区(包含运行时常量池)。
 

程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。为了线程切换后能恢复到正确的执行位置,每天线程都需要有一个独立的程序计数器,所以我们称这类内存区域为“线程私有”的内存。

 

java虚拟机栈

这类内存区域也是线程私有的,它的生命周期与线程相同。相当于汇编里的堆栈,当线程执行到对应的方法,栈就会不断地将方法参数、局部变量(基本数据类型、对象引用、returnAddress类型)、操作数栈等信息进栈出栈,来达到函数调用。

 

本地方法栈

与虚拟机栈所发挥的作用是非常相似的,区别为本地方法栈为虚拟机使用到的Native方法服务。

 

Java堆

java堆是所有线程共享的一块内存区域,唯一目的就是存放对象实例。实例化对象时,只是存储对象里面的非常量属性,对象里的方法并不用copy到堆中(相当于C语言的struct),方法是在执行时,在栈中分配参数变量、局部变量等内存。

分配内存,有两种方法:“指针碰撞”,java堆中的内存是绝对规整的,所有用过的内存放一边,空闲的内存放另一边,中间放着一个指针作为分界点的指示器,分配内存时只不过是移动指针,垃圾收集器带有压缩整理功能,使内存每时每刻都是规整的。“空闲列表”,java堆不是规整的,虚拟机维护一个列表,记录哪些内存块是可用的。

对象访问的方式有两种:
使用句柄:
 
 
直接指针:
 

方法区:

方法区也是各个线程共享的内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫Non-Heap(非堆),目的应该是与java堆区分开来。

运行时常量池:

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

运行时常量池,相对于Class文件常量池的另外一个重要特征是具备动态性,运行期间也可以将新的常量放入运行时常量池,如:String类的intern()方法。

 

本文引用:周志明的《深入理解java虚拟机》

 

转载请标明出处:http://blog.csdn.net/u012367513/article/details/38656909



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 字符串常量池在JVM中属于方法(也称为永久代)内存。方法是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。字符串常量池是方法中的一部分,用于存储字符串常量。在JDK 8之后,方法被取消了,取而代之的是元空间(MetaSpace),但字符串常量池仍然存放在元空间中。 ### 回答2: 字符串常量池在JVM的方法(也称为非堆)中。 JVM内存分为几个不同的区域,包括堆、方法虚拟机等。而字符串常量池是方法的一部分,用于存储在程序中直接使用的字符串常量。 在Java中,字符串常量池是一种特殊的内存存储区域,用于存储字符串常量,它的作用是提高字符串的重用性和效率。当我们使用双引号声明一个字符串时,JVM会首先在字符串常量池中查找是否存在相同内容的字符串,如果存在则直接返回引用,如果不存在则创建一个新的字符串并放入字符串常量池中。这种机制可以减少内存占用,提高程序的执行效率。 由于字符串常量池位于方法,它是与其他线程共享的,在程序运行过程中,多个线程可以同时访问字符串常量池。而且,字符串常量池的位置是在程序的执行过程中被动态调整的,当字符串没有被引用时,JVM会自动回收字符串常量池中的空间。 总结来说,字符串常量池是JVM的方法的一部分,用于存储程序中直接使用的字符串常量,并提高字符串的重用性和效率。 ### 回答3: 字符串常量池在JVM的方法。方法JVM的一个内存,用于存储类信息、常量、静态变量、即时编译器编译后的代码等。而字符串常量池就是方法的一部分,用于存储字符串常量。 在Java中,当我们使用字符串字面量(如"hello")时,编译器会将其放入字符串常量池中。当程序执行时,如果再次使用相同的字符串字面量,JVM会直接从字符串常量池中取出已存在的字符串对象,而不会创建新的对象,这样可以节省内存空间。 由于字符串在Java中使用非常频繁,所以将字符串常量池放在方法中,可以提高字符串的重用率。此外,字符串常量池的位置在方法中也有利于GC(垃圾回收),因为当某个字符串不再被引用时,GC可以更方便地回收该字符串常量。 需要注意的是,从Java 7开始,字符串常量池被移出了PermGen空间(方法的前身),并放置在堆中,这是因为字符串常量池中的字符串对象是可以被垃圾回收的,而且过多的字符串常量可能导致PermGen空间溢出的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值