线程共享:全部线程能访问这块内存数据,随虚拟机或GC而建立和销毁算法
线程独占:每一个线程都会有它独立的空间,随线程生命周期而建立和销毁数组
线程安全问题:共享资源的抢占、线程共享的内存区域安全
方法区做用:存储加载的类信息、常量、静态变量、JIT编译后的代码等数据布局
GC:方法区存在垃圾回收,但回收效率低;回收主要针对常量池的回收。和类型的卸载;当方法区没法知足内存需求时,报OOM。spa
方法区属于Java虚拟机协议,好比Hotsport虚拟机是对其具体实现,实现的时候会去实现方法区,堆内存,垃圾回收GC,永久代是对方法区的实现,新生代,老年代对堆内存实现,jdk1.8就变了,以元数据来实现方法区。线程
做用:惟一的目的就是存放对象实例,几乎全部对象、数组都是在这里存放3d
对于大多数应用来讲,堆是JVM管理的内存中最大的一块内存区域,也是最容易OOM的区域对象
大多数JVM都将堆实现为大小可扩展的(经过-Xmx、-Xms)控制blog
一、引用计数法(没法解决两个对象相互引用没法回收问题,致使内存泄露,JVM确定不回去使用这种方式)生命周期
二、可达性分析算法
主流的商用程序语言(Java、C#)都是经过可达性分析算法来断定对象是否存活的,
GC Roots能够是:一、虚拟机栈;二、方法中静态属性引用对象;三、方法区中常量引用对象;四、Native方法引用对象。
虚拟机栈:线程中方法执行的模型,每一个方法执行时,就会在虚拟机栈中建立一个栈帧,每一个方法从调用到执行的过程,就对应栈帧在虚拟机栈中从入栈到出栈过程。
Java线程本质是:从逻辑上来理解,开启一个Java线程,new Thread(()->{线程执行的业务代码})
main->show()->show1()->shou2()这样的调用链路,先进后出,就是栈,也就是表明虚拟机栈方法调用逻辑
虚拟机栈中的元素在逻辑上表明方法,表明方法的栈元素就叫作栈帧。
方法里的局部变量并非一致存在,只有在方法调用的时候才会存在,只有在方法调用才会有方法入栈。
本地方法栈:和虚拟机栈功能相似,虚拟机栈是为虚拟机执行Java方法而准备,本地方法栈是为虚拟机使用Native本地方法而准备的。
直接内存:JVM以外的内存,开发人员本身分配内存
如今看下整个过程执行流程
切换上下文方式,程序计数器来跟踪。