Java多线程 - 从JVM角度理解多线程

在JVM中,多个线程共享进程的方法区资源,但每一个线程有本身的程序计数器虚拟机栈本地方法栈java

什么是堆

Java虚拟机所管理的内存中最大的一块,java堆是全部线程共享到的一块内存区域,在虚拟机启动时建立,用于存放对象实例,几乎全部的对象实例以及数组都在这里分配内存算法

Java 堆是垃圾收集器管理的主要区域,所以也被称做GC 堆(Garbage Collected Heap).从垃圾回收的角度,因为如今收集器基本都采用分代垃圾收集算法,因此 Java 堆还能够细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。数组

上图所示的 eden 区、s0 区、s1 区都属于新生代,tentired 区属于老年代。大部分状况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,若是对象还存活,则会进入 s0 或者 s1,而且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增长到必定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,能够经过参数 -XX:MaxTenuringThreshold 来设置。post

什么是方法区

方法区与 Java 堆同样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。线程

同时运行时常量池也是方法区的一部分。已知,运用在string赋值时(非new),以及包装类Byte,Short,Integer,Long,Character,Boolean在-128~127范围内赋值时3d

什么是虚拟机栈

Java 内存能够粗糙的区分为堆内存(Heap)和栈内存 (Stack),其中栈就是如今说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。 (实际上,Java 虚拟机栈是由一个个栈帧组成,而每一个栈帧中都拥有:局部变量表、操做数栈、动态连接、方法出口信息。)指针

局部变量表主要存放了编译器可知的各类数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不一样于对象自己,多是一个指向对象起始地址的引用指针,也多是指向一个表明对象的句柄或其余与此对象相关的位置)。code

什么是本地方法栈

和虚拟机栈所发挥的做用很是类似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。cdn

本地方法被执行的时候,在本地方法栈也会建立一个栈帧,用于存放该本地方法的局部变量表、操做数栈、动态连接、出口信息。对象

什么是程序计数器

程序计数器是一块较小的内存空间,能够看做是当前线程所执行的字节码的行号指示器。字节码解释器工做时经过改变这个计数器的值来选取下一条须要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都须要依赖这个计数器来完。

另外,为了线程切换后能恢复到正确的执行位置,每条线程都须要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,咱们称这类内存区域为“线程私有”的内存。

Ref:

  1. 多是把Java内存区域讲的最清楚的一篇文章
相关文章
相关标签/搜索