运行时数据区域
双亲委派机制
Bootstrap classLoader
主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
包:jre\lib\rt.jar
ExtClassLoader
主要负责加载jre/lib/ext目录下的一些扩展的jar。
包:jre\lib\ext
AppClassLoader
主要负责加载应用程序的主函数类
执行流程
1、类加载收到类加载的请求
2、将这个类请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
3、启动类加载器检查是否能够加载当前类,能加载结束,否则抛出异常,通知子加载器进行加载
4、重复步骤
5、没有任何加载器能加载,就会抛出ClassNotFoundException
native
native 即 JNI,Java Native Interface
native 是用做java 和其他语言(如c++)进行协作时用的
也就是native 后的函数的实现不是用java写的
方法区
存放:**static、 final、Class 、常量池**
静态变量、常量、类信息(构造方法、接口定义),运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关
栈
特点:先进后出、后进先出
存放: 8大基本类型、对象的引用、实例的方法
队列
先进先出(FIFO)
堆
heap,一个JVM只会存在一个堆内存,堆内存的大小可以调节的
注:
1、To Survivor区是空的(作为保留区域)
2、jdk8中移除了永久带以后的内存结构**
设置JVM内存的参数有四个:
-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;默认值为物理内存的1/64
-Xmn Java Heap Young区大小,不熟悉最好保留默认值;
-Xss 每个线程的Stack大小,不熟悉最好保留默认值;
//返回虚拟机最大可用内存,对应-Xmx(默认值为物理内存的1/4) Runtime.getRuntime().maxMemory();
//当前JVM空闲内存
Runtime.getRuntime().freeMemory();
//返回jvm初始化的总内存
//当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和
Runtime.getRuntime().totalMemory();
OOM解决方法:
1、尝试加大堆内存看结果
- -Xms 1024m -Xmx 1024m -XX : +PrintGCDetails
2、分析内存,看一下那个地方出现了问题
(专业工具:Jprofile、jvisualvm(jdk自带的))