jvm

JVM

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");

    应对内存泄漏

    1. 一般情况下,考虑通过VM options给内存扩容。
    2. 依然无法解决情况下,通过专业工具处理。
      如:MAT,Jprofiler,-XX:+HeapDumpOnOutOfMemoryError。
      作用:
    • 快速定位内存泄露位置。
    • 查看“对象排行榜”,提供占用内容较大的对象。
    • 追踪引用链,暴露垃圾回收不成功的根源。
posted @ 2026-01-03 22:09  coldmist  阅读(14)  评论(0)    收藏  举报