a.java —>complier—>a.calss—>jvm<—o1.calss(程序需要加载的外部class) ———————————— 一、JVM内存管理——运行时数据区
(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 堆(新生代 老年代 持久代) 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