diff --git a/src/content/posts/Java/JVM内存模型分区.md b/src/content/posts/Java/JVM内存模型分区.md new file mode 100644 index 0000000..9d18f06 --- /dev/null +++ b/src/content/posts/Java/JVM内存模型分区.md @@ -0,0 +1,32 @@ +--- +title: JVM内存模型分区 +published: 2025-07-18 +description: '' +image: '' +tags: [JVM,内存模型] +category: 'Java' +draft: false +lang: '' +--- +# JVM内存模型分⼏个区,每个区放什么对象 + +![image.png](https://blog.meowrain.cn/api/i/2025/07/18/12an835-1.webp) + +![img](https://blog.meowrain.cn/api/i/2025/07/18/12b818c-1.webp) + +![image.png](https://blog.meowrain.cn/api/i/2025/07/18/12b1jr4-1.webp) + +![image.png](https://blog.meowrain.cn/api/i/2025/07/18/12awf70-1.webp) + +分为方法区,堆,本地方法栈,虚拟机栈,程序计数器 + +方法区(元空间):用于存储已经被虚拟机加载的类信息,常量,静态变量等数据。虽然方法区被描述为堆的逻辑部分,但有”非堆“的别名。方法区可以选择不实现垃圾收集,内存不足的时候,会抛出OutOfMemoryError异常。 + +程序计数器: 当前线程所执行的字节码的行号指示器,存储当前线程正在执行的Java方法的JVM指令地址。 + +JVM虚拟机栈:每个线程都有自己独立的Java虚拟机栈,生命周期和线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。 + +本地方法栈: 与Java虚拟机栈差不读多,执行本地方法,其中堆和方法区是线程共有的。 + +Java堆: 存放和管理对象实例,被所有线程共享。 + diff --git a/src/content/posts/Java/Java类加载器与双亲委派机制.md b/src/content/posts/Java/Java类加载器与双亲委派机制.md new file mode 100644 index 0000000..deadeb2 --- /dev/null +++ b/src/content/posts/Java/Java类加载器与双亲委派机制.md @@ -0,0 +1,41 @@ +--- +title: Java类加载器与双亲委派机制 +published: 2025-07-18 +description: '' +image: '' +tags: [Java,类加载器,ClassLoader,双亲委派机制] +category: 'Java' +draft: false +lang: '' +--- +# Java类加载器和双亲委派机制 + +[Java 虚拟机之类加载](https://dunwu.github.io/waterdrop/pages/3e37ea6e/#%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6) + +## Java类加载器层级 + +Java类加载器从高到低分为以下层级(以JDK 8为例): + +1. **启动类加载器(Bootstrap ClassLoader)** :加载JRE的`lib`目录下的核心类库(如`rt.jar`)。 +2. **扩展类加载器(Extension ClassLoader)** :加载`lib/ext`目录下的扩展类。 +3. **应用程序类加载器(Application ClassLoader)** :加载用户类路径(ClassPath)下的类。 +4. **自定义类加载器**:用户可自定义类加载器(需继承`ClassLoader`)。 + +## 什么是双亲委派机制 + +**双亲委派机制** 是Java类加载器的核心工作机制。它的核心思想是:当一个类加载器需要加载某个类时,不会直接尝试自己加载,而是将这个请求**逐级向上委托给父类加载器**处理。只有当所有父类加载器都无法完成加载时,子类加载器才会尝试自己加载。 + +## ## 示意图 + +![image.png](https://blog.meowrain.cn/api/i/2025/07/18/12c4ooa-1.webp) + +![image.png](https://blog.meowrain.cn/api/i/2025/07/18/12c4ix7-1.webp) + +[深入理解Java双亲委派机制:原理、意义与实战示例 - 云熙橙 - 博客园](https://www.cnblogs.com/xchangting/articles/18744083) + +## 双亲委派机制的好处 + +1. **保障核心类库的安全**防止用户自定义的类(如`java.lang.Object`)覆盖JVM核心类。例如,如果用户编写了一个恶意`String`类,双亲委派机制会优先加载核心库中的`String`,从而避免安全隐患。 +2. **避免重复加载**同一个类只会被一个类加载器加载一次,防止内存中出现多个相同类的副本,确保类的唯一性。 +3. **实现代码隔离**不同类加载器加载的类属于不同的命名空间,天然支持模块化(如Tomcat为每个Web应用分配独立的类加载器)。 +