JVM探索

运行时数据区域


 双亲委派机制

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自带的))

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容