jvm
JVM
jvm位置

jvm体系结构

类加载器
作用:加载一个类。

双亲委派机制
1.启动类加载器(BootStrap加载器);
2.拓展类加载器(Extension加载器);
3.应用类加载器(Application加载器)。
LoaderTest loaderTest = new LoaderTest();
ClassLoader classLoader = loaderTest.getClass().getClassLoader();
System.out.println(classLoader);//应用类加载器
//拓展类加载器
System.out.println(classLoader.getParent());
//启动类加载器
System.out.println(classLoader.getParent().getParent());
一个类加载器要加载类时,会先委托给父加载器加载,当父加载器找不到无法加载时,才会自己加载;为了保证类的唯一性和安全性。
- java9以后,舍弃了拓展机制引入了模块机制,拓展类加载器变更为平台类加载器,负责加载API。
- 自定义类加载器:在实际开发中,开发者会继承ClassLoader类来实现自己的加载逻辑,所以有时候也分为四层。
native关键字
作用:到了java无法解决或者涉及到java语言不够成熟的领域,通过本地方法栈,调用底层的C/C++代码解决。如文件管理系统,打印机控制,传感器。
使用:依赖JNI,通过本地方法栈,和本地方法接口的连接,调用本地方法库。
方法区Method Area
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,实例变量存储在堆内存中,和方法区无关系。
值传递和引用传递
值传递:就是在调用函数时,把实际参数值复制一份传递给函数,在函数内部修改值,不会影响原来的实际参数。
引用传递:调用函数时,把实际参数的地址传递给函数,函数对参数的修改会影响实际参数。
栈Stack
每个线程都有独立私有的栈,线程结束栈就会被销毁。
栈由一系列栈帧组成,每个方法被调用的时候,jvm都会为其创建一个独立的栈帧。
栈帧的创建超出栈的深度会发生栈溢出错误StackOverflowError,栈深度是可拓展的。
堆Heap
虚拟机只有一个堆,堆存在GC(垃圾回收机制)。
分为三个区:新生区,养老区,永久存储区(java8开始,“元空间”)。
-
新生区:分为伊甸园区和幸存者0区和幸存者1区,轻垃圾回收机制没有回收成功的会流到幸存区,幸村区是流动的。
-
养老区:幸存区满后会运行重垃圾回收机制,回收没成功的流到养老区,养老区满就会报内存溢出错误OutOfMemoryError。
-
永久存储区:存储常量池,类的结构。
现在的堆分为若干个小的块,不再明显的分为三大块,但是主要构成,比如垃圾回收G1,新生区,幸存区,元空间依旧存在,永久存储区变为申请虚拟内存,逻辑上属于,实际上未占用。
long max = Runtime.getRuntime().maxMemory();
long total = Runtime.getRuntime().totalMemory();
System.out.println("max=" + max + "字节\t" +(max/(double)1024/1024)+"MB");
System.out.println("total=" + total + "字节\t" +(total/(double)1024/1024)+"MB");应对内存泄漏
- 一般情况下,考虑通过VM options给内存扩容。
- 依然无法解决情况下,通过专业工具处理。
如:MAT,Jprofiler,-XX:+HeapDumpOnOutOfMemoryError。
作用:
- 快速定位内存泄露位置。
- 查看“对象排行榜”,提供占用内容较大的对象。
- 追踪引用链,暴露垃圾回收不成功的根源。

浙公网安备 33010602011771号