先上图
3个部分中运行时数据区最主要
栈(虚拟机栈、线程栈):局部变量,方法的局部变量只在方法的运行作用域范围之内有效 。java虚拟机,只要线程开始运行,当执行到方法的时候,就会给这个方法在线程栈分配一块自己专属的内存区域,这一小块内存空间就叫栈帧内存空间,用来存放方法自己的局部变量。这个栈遵循先进后出(FILO),跟方法的嵌套、调用顺序相符合,有压栈弹栈。
程序计数器:是一个记录着当前线程所执行的字节码的行号指示器。在JVM中,通过程序计数器来记录某个线程的字节码执行位置。因此,程序计数器是具备线程隔离的特性,也就是说,每个线程工作时都有属于自己的独立计数器。程序计数器的值是由执行引擎来修改的。
方法区:1.8之前叫永久代,之后叫元空间,是操作系统的物理内存。存放常量、静态变量、类信息。
本地方法栈:native修饰的,运行本地方法时分配的内存空间
堆:
可达性:将“GC Roots”对象作为起点,从这些节点开始向下搜索引用的对象,能找到的对象标记为“非垃圾对象”其余未标记的对象都是垃圾对象。线程栈的本地变量、静态变量、本地方法栈的对象等等都可以作为GC Toots的根节点。没有指针指向的游离对象会被回收。



