# 一、JVM基础知识
## 1.详解JVM内存结构
>- 程序计数器:当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有;
>- Java虚拟栈:存放基本数据类型、对象的引用、方法出口等,线程私有;
>- 本地方法栈:和虚拟栈相似,只不过它服务于Native方法,线程私有;
>- Java堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享;
>- 方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享;
>- 直接内存:这部分内存不是Java虚拟机规范中定义的内存区域。不受Java堆大小的限制,但是也可能导致OOM的产生;(可以不用说)
## 2.谈一谈Java的内存模型(JMM)
Java的内存模型就是一种符合内存模型规范的,屏蔽各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。
Java内存模型规定了所有的变量都存储在主内存中,每条线程拥有自己独立的工作内存,线程的工作内存中保存了该线程中使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步。
关于主内存与工作内存之间具体的交互协议



