JVM学习总结

JVM学习总结

JVM(Java Virtual Machine),是一种用于计算设备的规范,它是虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的

JVM体系结构

Java虚拟机主要分为五大模块:类装载器子系统、运行时数据区、执行引擎、本地方法接和垃圾收集模块

img

类加载器------双亲委派机制

  1. JVM预定义的三种类型类加载器:

  • 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

  • 标准扩展(Extension)类加载器:是由Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将<Java_Runtime_Home>/lib/ext或者由系统变量java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

  • 系统(System)类加载器:是由Sun的AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的它负责将系统类路径(ClASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

  1. 双亲委派机制描述

某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有类加载器无法完成此加载任务时,才自己去加载。

作用:

  1. 防止一个类被重复加载,如果父类加载器加载了这个类,子类就不用再次加载了

  2. 防止类信息被篡改,如果自己定义一个java.lang.String,会发现这个类根本运行不了,会在根加载器就已经加载完成

Native和方法区

方法名前有个native关键字修饰,此方法是本地方法,java无法实现(需要调用底层),通过调用java本地接口,调用本地方法库实现

方法区是被所有线程共享的,所有字段和方法字节码,以及一些特殊方法,接口代码也定义在此

所有定义的方法的信息都存储在该区域,此区域属于共享区域

静态变量(static),常量(final),类信息(Class)(构造方法,接口定义),运行时的常量池存在方法区中,实例变量存在堆中,与方法区无关

栈和堆

  • 栈也叫栈内存,主管Java程序的运行,实在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。基本类型的变量和对象的引用变量都是在函数的栈内存中分配。

  • 堆这块区域是JVM中最大的,应用的对象和数据都是存在这个区域,这块区域也是线程共享的,也是gc主要的回收区,一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,以方便执行器执行。

堆的内存结构

img

使用JPofiler工具分析OOM原因

垃圾回收机制

 

 
posted @ 2022-03-29 17:25  jiangli001  阅读(29)  评论(0)    收藏  举报