技术分享
未读类的生命周期 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。 类的加载: 查找并加载类的二进制数据 加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 通过一个类的全限定名来获取其定义的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。 相对于类加载的其他阶段而言,加载阶段(准确地说,是加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载。 加载阶段完成后,虚拟机外部的 二进制字节 ...
技术分享
未读运行时数据区 内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。 下图是 JVM 整体架构,中间部分就是 Java 虚拟机定义的各种运行时数据区域。 Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程一一对应的数据区域会随着线程开始和结束而创建和销毁。 线程私有:程序计数器、虚拟机栈、本地方法区 线程共享:堆、方法区, 堆外内存(Java7的永久代或JDK8的元空间、代码缓存) 一、程序计数器 程序计数寄存器(Program Counter Register),Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的线程信息,CPU 只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器,叫程序计数器(或PC计数器或指令计数器)会更 ...
判断一个对象是否可被回收 1. 引用计数算法 给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。 两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。 正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。 1234567891011public class ReferenceCountingGC { public Object instance = null; public static void main(String[] args) { ReferenceCountingGC objectA = new ReferenceCountingGC(); ReferenceCountingGC objectB = new ReferenceCountingGC(); objectA.instance = objectB; objectB.instance = objectA; }} 2. 可达性分析算法 通 ...
Redis 和 MySQL 一致性问题是企业级应用中常见的挑战之一,特别是在高并发、高可用的场景下。由于 Redis 是内存型数据库,具备极高的读写速度,而 MySQL 作为持久化数据库,通常用于数据的可靠存储,如何保证两者数据的一致性需要具体业务场景的设计与优化。 下面我们将结合几个典型的业务场景,逐步分析如何在不同的场景下保证 Redis 和 MySQL 之间的数据一致性。 1. 缓存更新策略:Cache Aside Pattern(旁路缓存模式) 场景: 在大部分业务系统中,Redis 作为缓存层用于提升系统的读取性能,而 MySQL 作为持久化存储,用于保证数据的可靠性。最常见的场景是: 系统先查询 Redis 缓存,如果缓存中没有数据,再从 MySQL 中查询并将数据写入 Redis 缓存。 更新数据时,更新 MySQL 并删除 Redis 缓存,使缓存数据失效,保证下次读取时能拿到最新数据。 典型业务场景: 商品详情页面:当用户请求某个商品详情时,首先查询 Redis 缓存,如果缓存中没有,则查询 MySQL,将查询结果缓存到 Redis 中;如果商品信息发生变更时, ...
虚拟线程是 Java 21 引入的一个新特性,用于简化并发编程。它与传统的操作系统线程相比,具有显著的优势: 轻量级:虚拟线程由 JVM 管理,而非操作系统,因此它们的内存占用和创建成本远低于传统线程。理论上,你可以轻松创建数十万甚至更多的虚拟线程。 高并发性:虚拟线程能处理更高并发的场景,特别是 I/O 密集型的应用,适合开发高并发、响应式的应用程序。 自动管理:无需手动管理线程池,JVM 会根据负载自动调整虚拟线程的调度,简化了并发编程的复杂性。 虚拟线程的基础用法 创建虚拟线程非常简单。你可以像创建传统线程一样启动虚拟线程,但它的创建与启动更加轻量: 1234Thread virtualThread = Thread.ofVirtual().start(() -> { System.out.println("虚拟线程正在运行");});System.out.println("主线程正在运行"); 虚拟线程的延时启动: 12345678// 虚拟线程定义,是用unstarted来定义线程的核心事务,但不直接启动Thread virtualThread = Thre ...
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。 本文采用的源码版本是 4.3.11.RELEASE,算是 5.0.x 前比较新的版本了。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少人这么做了,至少不是纯 xml 配置,不过从理解源码的角度来看用这种方式来说无疑是最合适的。 阅读建议:读者至少需要知道怎么配置 Spring,了解 Spring 中的各种概念,少部分内容我还假设读者使用过 SpringMVC。本文要说的 IOC 总体来说有两处地方最重要,一个是创建 Bean 容器,一个是初始化 Bean,如果读者觉得一次性看完本文压力有点大,那么可以按这个思路分两次消化。读者不一定对 Spring 容器的源码感兴趣,也许附录部分介绍的知识对读者有些许作用。 希望通过 ...
一、Spring框架学习路线图 二、什么是Spring ? Spring 是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由 Rod Johnson 在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。 然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EE full-stack(一站式) 轻量级开源框架。 简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 三、Spring 框架组件 Gro ...
技术分享
未读由于微软在Office 2016之后的版本均不提供ISO镜像下载(指正版商业镜像),VL版本的Office需要管理员手动使用ODT工具进行部署。 一、下载ODT工具 ODT工具下载: 官方下载地址 点击[Download]按钮下载微软官网提供的ODT工具,下载下来的是一个自解压程序的压缩包,双击选择解压位置,你就会得到一个红色图标的setup.exe和一些示例的xml文件。我们只要其中的setup.exe即可。 二、定制自己的Office套件 点击此处开始配置 打开上面的微软Office提供的Office配置定制网站,可以自由地定制想要的Office。此处仅介绍几个重点: 版本选择:请选择带批量许可证字样的版本,同时请不要选择带SPLA字样的版本。(注意:如果你要安装Visio之类的组件,LTSC版本会和个人版OFFICE冲突,如果你电脑上有个人版OFFICE导致安装冲突请不要选择带LTSC字样版本。) 你可以自由选择安装的组件和语言,比如仅安装Word,Excel和PowerPoint。 授权和激活:开启自动接受EULA,点选KMS选项。 DIY好你心仪的配置之后,可以点击导出按钮 ...
2000年问题 2000年问题(英语:Year 2000 Problem),在英文中也被简称为Y2K,在中国大陆及香港常被称为千年虫问题,台湾则称千禧蟲危机,是指由于当时的计算机程序在日期表达上的设计问题,从而导致计算机会误读在2000年后的一些日期,并进一步导致计算机出现错误所引起的计算机问题,当时的计算机程序普遍采用6位数字来存储时间,只显示四位数字后的两位数字,但这又会导致计算机系统紊乱,使其无法区分2000年与1900年,从而导致了误读问题,并导致计算机紊乱。2000年问题可能会威胁到那些运行在重要行业中的计算机与大量社会基础设施,甚至影响到政府部门与军队。从而导致停水、断电,银行瘫痪,最极端的情况下,它甚至可能会导致核电厂发生事故,核武器与导弹失控以及交通与通信的中断,并最终引发灾难性的后果。 这个悬挂于南特中央理工学院的电子标志将2000年1月3日错误显示为了1900年1月3日。 但最终,在2000年问题引起社会广泛重视后,它得到了足够的关注与处理,最终在规模庞大的修复行动后,它没有在新千年到来之际引起全球电脑系统的大规模瘫痪。 程序问题本源 两千年问题始于1960年代, ...
Proxifier注册码序列号 12345L6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C(Portable Edition)#免安装版本5EZ8G-C3WL5-B56YG-SCXM9-6QZAP(Standard Edition)#安装版本P427L-9Y552-5433E-8DSR3-58Z68(MAC) #mac版本 otPlayer软件本身没有代理这个功能,需要借助专门的代理桌面软件才能实现播放被屏蔽的直播源、YOUTUBE视频。 首先你要有代理账号,安装了科学上网软件。 安装Proxifier http://www.hanzify.org/software/13717.html ,添加代理服务器IP127.0.0.1,端口1080。 代理规则可以设置Default全局所有的软件都走代理。也可以新建一个只允许PotPlayer走代理,Default全局direct直接连接的规则。 此时PotPlayer就能使用代理访问被墙的视频了。