一、Java虚拟机(JVM)体系结构
1. 什么是JVM?
JVM是Java程序的运行环境,负责将.class
字节码文件翻译成机器指令。不同厂商(如Oracle、IBM)可按规范实现自己的JVM,常见的实现包括:
- HotSpot:Oracle JDK/OpenJDK默认JVM,优化了性能。
- JRockit:曾专注于服务器端优化,现技术已整合至HotSpot。
- IBM J9:IBM JDK的核心,以低内存占用和快速启动著称。
- Azul Zing:专为高负载企业应用设计,支持实时处理。
- OpenJ9:轻量级开源实现,适合云原生环境。
2. JVM运行时数据区
JVM启动时创建以下内存区域,程序运行期间始终存在:
区域名称 | 功能说明 | 类比现实场景 |
---|---|---|
程序计数器 | 记录当前线程执行的字节码指令地址(类似"书签")。 | 读书时标记当前页码 |
虚拟机栈 | 存储方法调用的局部变量、操作数栈等(每个方法对应一个栈帧)。 | 文件夹中叠放的纸质文件 |
堆(Heap) | 存放所有对象实例和数组,是垃圾回收(GC)的主要区域。 | 仓库,存放所有生产出的商品 |
方法区 | 存储类信息、常量、静态变量等(Java 8后称为"元空间")。 | 图书馆的书籍目录和档案室 |
运行时常量池 | 方法区的一部分,存放编译期生成的常量(如字符串"Hello")。 | 书籍中的固定公式表 |
本地方法栈 | 为Native方法(如C/C++代码)提供服务,与虚拟机栈类似。 | 特殊工具箱,存放非标准工具 |
二、单例模式:一个对象的全局唯一性
1. 什么是设计模式?
设计模式是解决软件设计问题的通用模板。单例模式属于创建型模式,确保一个类只有一个实例,并提供全局访问点。
2. 单例模式的核心实现
|--------------------------------------------------------------|
| public class Singleton {
|
| // 1. 私有化构造方法(禁止外部new对象)
|
| private Singleton() {}
|
| |
| // 2. 定义静态变量,类加载时初始化实例
|
| private static final Singleton INSTANCE = new Singleton();
|
| |
| // 3. 提供公开的静态方法获取实例
|
| public static Singleton getInstance() {
|
| return INSTANCE;
|
| }
|
| }
|
3. 懒汉式单例(延迟初始化)
|------------------------------------------------------------|
| public class LazySingleton {
|
| private static LazySingleton instance;
|
| |
| private LazySingleton() {}
|
| |
| public static synchronized LazySingleton getInstance() {
|
| if (instance == null) {
|
| instance = new LazySingleton();
|
| }
|
| return instance;
|
| }
|
| }
|
注意事项
- 线程安全 :基础懒汉模式需加
synchronized
关键字,或使用双重检查锁(Double-Checked Locking)。 - 性能优化:推荐使用静态内部类或枚举实现,避免同步开销。
Jvm体系结构
jvm对应了一套规范(java虚拟机规范),它可以有不同的实现
-
Java规范是一种抽象的概念,它可以用于多种不同的实现
- HotSpot:由Oracle公司开发,是目前最常用的虚拟机实现,也是目前最常用的虚拟机实现,也是默认的Java虚拟机,默认包含在Oracle JDK和OpenJDK中
- JRockit:JRockit是由Oracle公司开发,它是一款针对生产环境优化JVM实现,能够提供性能和可伸缩性
- IBM JDK:IBM JDK是由IBM公司开发的java环境,采用Hotspot不同的J9VM,能够提供更小的内存占用和更迅速的启动时间
- Azul Zing:是针对生产环境优化的虚拟机实现,能够提高性能和实时处理能力,适用于高负载企业应用和实时分析场景
- OpenJ9:是由IBM开发优化的Java虚拟机实现,支持高度轻量级,低时延时的GC优化的JIT编译器和用于健康度测试的可观察下仪表盘
-
Jvm规范中运行时数据区
- The pc Register(程序计数器):是一块较小的内存空间,此计数器记录的是正在执行的虚拟机字节码指令的地址
- Java Virtual Machine Stacks(java虚拟机栈):Java虚拟机用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
- Heap(堆):是java虚拟机管理的最大的一块内存,堆内存用于存放Java对象实例以及数组。堆是垃圾收集器的主要区域。
- Method Area(方法区):用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码和数据。
- Run-Time Constant Pool(运行时常量池):是方法区的一部分,用于存放编译期生成的各种自变量与符号引用
- Native Method Stacks(本地方法栈):在本地方法的执行过程中,会使用到本地方法栈。和java虚拟机栈十分相似/
总结:这些运行时数据区虽然在功能上有所区别,但再整个Java虚拟机启动时都需要被创建,并且在虚拟机运行期间始终存在,直到虚拟机停止运行时被销毁。同时不同的JVM实现对运行时数据区的分配和管理方式也可能不同,会对性能和功能产生影响



单例模式(一个对象)
设计模式概述
什么是概述模式
设计模式是一套被广泛接受的,经过试验的,可以重复利用的解决方案。设计模式是针对软件开发常见问题和模式的通用解决方案。
设计模式有哪些
GoF设计模式
架构设计模式
企业级设计模式
领域驱动设计模式
并发设计模式
数据访问模式
GoF设计模式分类
创建型:主要解决对象创建问题
结构型:通过设计和构建对象之间的关系,达到更好的重用性、拓展性、灵活性
行为型:主要用于对象之间的算法与责任分配
单例模式怎么实现
构造方法私有化
对外提供一个公开的静态方法
定义一个静态变量,类加载的时候,初始化静态变量