零基础入门Java虚拟机与单例模式:新手友好教程


一、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虚拟机规范),它可以有不同的实现

  1. Java规范是一种抽象的概念,它可以用于多种不同的实现

    1. HotSpot:由Oracle公司开发,是目前最常用的虚拟机实现,也是目前最常用的虚拟机实现,也是默认的Java虚拟机,默认包含在Oracle JDK和OpenJDK中
    2. JRockit:JRockit是由Oracle公司开发,它是一款针对生产环境优化JVM实现,能够提供性能和可伸缩性
    3. IBM JDK:IBM JDK是由IBM公司开发的java环境,采用Hotspot不同的J9VM,能够提供更小的内存占用和更迅速的启动时间
    4. Azul Zing:是针对生产环境优化的虚拟机实现,能够提高性能和实时处理能力,适用于高负载企业应用和实时分析场景
    5. OpenJ9:是由IBM开发优化的Java虚拟机实现,支持高度轻量级,低时延时的GC优化的JIT编译器和用于健康度测试的可观察下仪表盘
  2. Jvm规范中运行时数据区

    1. The pc Register(程序计数器):是一块较小的内存空间,此计数器记录的是正在执行的虚拟机字节码指令的地址
    2. Java Virtual Machine Stacks(java虚拟机栈):Java虚拟机用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
    3. Heap(堆):是java虚拟机管理的最大的一块内存,堆内存用于存放Java对象实例以及数组。堆是垃圾收集器的主要区域。
    4. Method Area(方法区):用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码和数据。
    5. Run-Time Constant Pool(运行时常量池):是方法区的一部分,用于存放编译期生成的各种自变量与符号引用
    6. Native Method Stacks(本地方法栈):在本地方法的执行过程中,会使用到本地方法栈。和java虚拟机栈十分相似/

总结:这些运行时数据区虽然在功能上有所区别,但再整个Java虚拟机启动时都需要被创建,并且在虚拟机运行期间始终存在,直到虚拟机停止运行时被销毁。同时不同的JVM实现对运行时数据区的分配和管理方式也可能不同,会对性能和功能产生影响

单例模式(一个对象)

设计模式概述

什么是概述模式

设计模式是一套被广泛接受的,经过试验的,可以重复利用的解决方案。设计模式是针对软件开发常见问题和模式的通用解决方案。

设计模式有哪些

GoF设计模式

架构设计模式

企业级设计模式

领域驱动设计模式

并发设计模式

数据访问模式

GoF设计模式分类

创建型:主要解决对象创建问题

结构型:通过设计和构建对象之间的关系,达到更好的重用性、拓展性、灵活性

行为型:主要用于对象之间的算法与责任分配

单例模式怎么实现

构造方法私有化

对外提供一个公开的静态方法

定义一个静态变量,类加载的时候,初始化静态变量

相关推荐
xingshanchang3 分钟前
Matlab的命令行窗口内容的记录-利用diary记录日志/保存命令窗口输出
开发语言·matlab
Risehuxyc3 分钟前
C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
开发语言·c++
AI视觉网奇10 分钟前
git 访问 github
运维·开发语言·docker
不知道叫什么呀17 分钟前
【C】vector和array的区别
java·c语言·开发语言·aigc
liulilittle37 分钟前
.NET ExpandoObject 技术原理解析
开发语言·网络·windows·c#·.net·net·动态编程
wan_da_ren1 小时前
JVM监控及诊断工具-GUI篇
java·开发语言·jvm·后端
委婉待续1 小时前
计算机网络通信的相关知识总结
开发语言·网络
cui_hao_nan1 小时前
JAVA并发——什么是Java的原子性、可见性和有序性
java·开发语言
best_virtuoso1 小时前
JAVA JVM垃圾收集
java·开发语言·jvm
lifallen1 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka