a.java —>complier—>a.calss—>jvm<—o1.calss(程序需要加载的外部class)
————————————
一、JVM内存管理——运行时数据区
tomcat JVM_第1张图片

(1)Methid Area(方法区) :与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

(2)堆内存 (Heap Memory):java堆是JVm所管理的内存中最大的一部分,也是GCC管理的主要区域,主流的算法都基于分代收集方式进行,线程共享
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

(3)JVM栈 (Java Virtual Machine Stacks) : 线程私有,存放线程自己的局部变量等信息
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

(4)本地方法栈 (Native Method Stacks) :

(5)程序计数器 (Program Counter (PC) Register):线程独占的内存空间

2、JVM 堆(新生代 老年代 持久代)
tomcat JVM_第2张图片
Eden space:where objects are bron(新生区,初创对象)
Survivor Space:Where objects mature(to和from,步入成熟期的初创对象)
Tenure Space:Where objects grow old and die()

3、垃圾回收器
新生代回收:Minor GC
(1)在Eden创建两个,1个存活的放在to,1个不用的直接GC
(2)又创建两个,在to和from中需要GC的会放在to当中GC,保存的放在from,而没到to和from的则直接GC
(3)在from中的放到OLD
OR
(3)在from放到to
老年代回收:Major GC(FULL GC)
遍历整个OLD——>标记——>打包——>清除

4、堆内存空间的调整参数
-Xmx 新生代和老年代=总共可用的最大空间
-Xms 二者初始化空间
-XX:NewSize 新生代初始化空间
-XX:MaxNesSize 新生代的最大空间
-XX:MaxPermSize 持久代的最大空间
-XX:PermSize 持久代初始化空间
CATALINA_OPTS:仅对tomcat生效
JAVA_OPTS:对OS的所有JAVA虚拟机生效

5、问题
(1)OutOfMemoryError:内存不足
(2) 内存泄漏
(3)线程锁死
(4)锁竞争(Lock Contention)
(5)JAVA消耗过多的CPU
监控jsp jstack jmap jhat jstat