深入理解java虚拟机

Posted oeleven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解java虚拟机相关的知识,希望对你有一定的参考价值。

java内存区域

Java虚拟机执行java程序时会将管理的内存划分为若干个区域:

技术分享图片

 

  1. 程序计数器

    程序计数器是一个”线程私有“的内存区域,用于获取下一条需要执行的字节码指令,如分支、循环、跳转等。

  2. Java虚拟栈

    在Java内存划分的时候,经常会听到将其分为”堆内存“和”栈内存“,这种分法中的”栈内存“就是指Java虚拟栈,更具体点就是Java虚拟栈中的局部变量表部分。——局部变量表存放的是java基本数据类型(如boolean、int等)、对象引用(reference类型,可能是对象起始地址的引用指针、代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向一条字节码指令的地址)。

    Java虚拟栈同样也是”线程私有“的内存区域,各个线程互不影响。

  3. 本地方法栈

    该区域与虚拟机栈所发挥的作用非常相似,只是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的本地操作系统(Native)方法服务。

  4. Java堆

    Java堆是虚拟机管理的内存中最大的一块,它是被所有线程共享的一块区域,用于存放对象实例,是GC回收的主要区域。

    Java堆可以是物理上不连续的内存空间,只要逻辑是连续的即可。

  5. 方法区

    方法区也是各个线程共享的内存区域,用于存放被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。——在jdk1.7之后,字符串常量重新被移到了堆中。

  6. 运行时常量池

    运行时常量池属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。——常量不一定只有运行时才会产生,运行期间也可以放入新的常量,例如String.intern()方法。

以上是关于深入理解java虚拟机的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java虚拟机-常用vm参数分析

深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析

《深入理解Java虚拟机》读后笔记-HotSpot虚拟机对象探秘

深入理解Java虚拟机类加载机制

Java虚拟机系列(25篇文章)一起啃

深入理解java虚拟机