自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 synchronized详解

一、基本使用1.1、对象锁1.2、类锁二、原理解析2.1、对象头规范2.1.1、对象头内容2.1.2、对象头布局2.1.3、 大小端模式2.2、锁状态2.2.1、无锁2.2.2、偏向锁2.2.2.1、偏向锁加锁2.2.2.2、偏向锁升级2.2.2.3、批量重偏向2.2.2.4、批量撤销2.2.3、轻量锁2.2.3.1、轻量锁的加锁2.2.3.2、轻量锁的释放2.2.4、自旋锁2.2.4.1、适应性自旋2.2.5、重量锁2.3、锁升级一、基本使用synchronized是Java并发编程中的同步机制关键字,它

2022-07-18 23:33:23 3694 2

原创 排序算法总结

快速排序是一种不稳定的排序算法。首先设置三个指针, 指向区间左端, 指向区间右端, 为当前的分界值。从待排序的数据元素中选取一个(通常为第一个)作为基准值元素 ,设置双指针 指向区间左端, 指向区间右端。复杂度分析归并排序是一种稳定的排序算法。当我们要排序这样一个数组的时候,首先将这个数组从中间分成两个子数组,一直递归地把子数组划分成更小的子数组,直到子数组里面只有一个元素。接下来依次按照递归的返回顺序,不断地合并排好序的子数组,直到最后把整个数组的顺序排好。复杂度分析插入排序是一种稳定的排序算法。

2022-07-06 21:35:48 567 1

原创 二分查找(折半查找)

二分查找也常被称为二分法或者折半查找,每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为 O(n) 的数组,二分查找的时间复 杂度为 O(log n)。举例来说,给定一个排好序的数组 {3, 4, 5, 6, 7},我们希望查找 4 在不在这个数组内。第一次折半时考虑中位数 5,因为 5 大于 4 ,所以如果 4 存在于这个数组,那么其必定存在于 5 左边这一 半。于是我们的查找区间变成了 {3, 4, 5}。(注意,根据具体情况和您的刷题习惯,这里的 5 可以

2022-07-03 11:28:08 1943

原创 最易懂的贪心算法

顾名思义, 贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。举一个最简单的例子:小明和小王喜欢吃苹果,小明可以吃五个,小王可以吃三个。已知苹果园里有吃不完的苹果,求小明和小王一共最多吃多少个苹果。在这个例子中,我们可以选用的贪心策略为,每个人吃自己能吃的最多数量的苹果,这在每个人身上都是局部最优的。又因为全局结果是局部结果的简单求和,且局部结果互不相干,因此局部最优的策略也同样是全局最优的策略。因为饥饿度最小的孩子最容易吃饱,所以我们先考虑这个孩子。为了尽量使

2022-06-26 17:49:47 476

原创 线程的启动与安全中止

文章目录一、线程的启动1.1、Thread1.2、Runnable1.3、Callable二、线程的中止2.1、interrupt() 与 isInterrupted() 方法2.2、InterruptedException 异常2.3、FutureTask一、线程的启动线程有两种启动方式,即继承Thread类与重写Runable接口,如下:1.1、Thread有关 Thread 创建线程,在初识Java多线程中的线程的创建函数其实已经介绍过了,这里就不赘述了。1.2、RunnableRu

2022-05-26 00:02:37 186

原创 初识Java多线程

文章目录一、进程与线程二、线程模型2.1、一对一模型2.2、多对一模型2.3、多对多模型三、内核态与用户态四、线程的创建函数一、进程与线程进程是操作系统进行资源分配的最小单位,其中资源包括:CPU、内存空间、 磁盘 IO 等,同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的。进程是程序在计算机上的一次执行活动。当运行了一个程序,就启动了一个进程。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身,用户进程就

2022-05-25 13:11:31 216

原创 JIT即时编译器

文章目录一、解释器与编译器二、热点代码与热点探测2.1、方法调用计数器2.2、回边计数器三、分层编译四、编译优化4.1、方法内联4.2、标量替换一、解释器与编译器Java程序在运行的时候,主要就是执行字节码指令,一般这些指令会通过解释器(Interpreter)进行解释执行,这种就是解释执行。当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为 热点代码。为了提高热点代码的执行效率,在运行时虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即

2022-05-19 17:16:14 2070

原创 虚拟机性能监控与故障处理工具

文章目录一、JDK的命令行工具1.1、jps1.2、jstat1.3、jinfo1.4、jmap 和 jhat1.5、jhat1.6、jstack一、JDK的命令行工具JDK的 bin 目录下为我们提供了很多的工具,如在 Windows安装JDK及Maven 中使用的 java、javac ,以及在 类文件结构及字节码指令 中使用的 javap 等,其实bin目录下还为我们提供了很多的工具,包括了很多用于监视虚拟机性能和故障处理工的工具,如下:这里可以启动如下代码,然后利用介绍的JDK命令行工具查看

2022-05-19 12:07:55 795

原创 方法调用的实现

文章目录一、解析1.1、非虚方法1.2、虚方法二、分派2.1、静态分派2.2、动态分派三、Lambda表达式3.1、MethodHandle 方法句柄应用代码经过编译、类加载的各种阶段,进入了JVM的运行时数据区。代码的执行其实本质上是方法的执行,站在JVM的角度归根到底还是字节码的执行。一、解析关于方法的调用,Java 字节码共提供了5个指令,来调用不同类型的方法:invokestatic: 用来调用静态方法invokespecial: 用于调用私有方法、构造器及 super 关键字等in

2022-05-18 14:03:43 258

原创 自定义类加载对类进行加密和解密

在JVM类加载器中,我们介绍除了最基础的3种类加载器互相配合进行加载的,我们如果有必要,是加入自己定义的类加载器。这里我们就来自定义一个类加载器,用于实现对类进行加密和解密处理。首先新建一个User.java文件,其中内容具体如下:package com.rockvine.loader;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringS

2022-05-18 11:42:33 920

原创 JVM类加载器

文章目录一、类加载器二、类与类加载器三、双亲委派模型四、破坏双亲委派模型4.1、Tomcat4.1.1、WebApp类加载器4.1.2、Shared类加载器4.1.3、Catalina类加载器4.1.4、Common类加载器4.1.5、Jsp类加载器4.2、JDBC一、类加载器从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语

2022-05-17 22:12:25 3106

原创 类加载的时机及过程

文章目录一、加载二、验证(了解即可)2.1、文件格式验证2.2、元数据验证2.3、字节码验证2.4、符号引用验证三、准备四、解析五、初始化5.1、常见案例类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading) 7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。加

2022-05-17 16:49:37 589 1

原创 Java SPI机制

SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。Java SPI实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候能不在程序里动态指明,这就

2022-05-17 13:43:33 246

原创 Java RMI

RMI (Remote Method Invocation) 远程方法调用,可以认为是RPC的Java版本,使用 RMI 技术可以使一个Java 虚拟机中的对象,调用另一个Java 虚拟机中的对象方法并获取调用结果。使用的是JRMP(Java Remote Messaging Protocol)协议,JRMP是专门为Java定制的通信协议,所以是纯Java的分布式解决方案,对用非Java语言开发的应用系统的支持不足,不能与用非Java语言书写的对象进行通信。RMI 在编写一个接口需要作为远程调用时,

2022-05-17 11:41:54 964

原创 类文件结构及字节码指令

文章目录一、Class类文件的结构1.1、魔数与Class文件的版本1.2、常量池1.3、访问标志1.4、类索引、父类索引与接口索引集合1.5、字段表集合1.6、方法表集合1.7、属性表集合二、字节码指令2.1、加载和存储指令2.2、运算指令2.3、类型转换指令2.4、对象创建及访问指令2.5、操作数栈管理指令2.6、控制转移指令2.7、方法调用指令2.8、方法返回指令2.9、异常处理指令2.10、同步指令一、Class类文件的结构Class文件时一组以8位字节为基础的二进制流,各个数据项目严格按照顺序

2022-05-16 17:58:47 251

原创 HotSpot的算法实现

文章目录一、并发标记与三色标记1.1、并发标记过程中漏标问题1.1.1、CMS 解决方案1.1.2、G1 解决方案二、G1的技术细节2.1、跨代引用2.2、RSet(记忆集)2.3、CardTable三、安全点与安全区域3.1、安全点3.2、安全区域一、并发标记与三色标记在三色标记法之前有一个算法叫 Mark-And-Sweep(标记清除)。这个算法会设置一个标志位来记录对象是否被使用。最开始所有的标记位都是 0,如果发现对象是可达的就会置为 1,一步步下去就会呈现一个类似树状的结果。等标记的步骤完成后

2022-05-16 12:25:13 690

原创 垃圾收集器

文章目录一、Serial/Serial Old二、ParNew三、Parallel Scavenge/Parallel Old四、CMS五、G1六、ZGC垃圾收集算法是内存回收的方法论,而垃圾收集器就是内存回收的具体实现。不同分代之间是有着不同的收集器的,如果两个收集器之间存在连线,那就说明他们可以搭配使用。那么是如何在虚拟机中指定它使用上图中搭配的垃圾收集器呢?主要如下:参数说明-XX:+UseSerialGC新生代和老年代都用串行收集器,,即 Serial 和 Serial

2022-05-07 00:15:32 613

原创 垃圾收集算法

文章目录一、复制算法1.1、Appel式回收二、标记-清除算法三、标记-整理算法当前商业虚拟机的垃圾收集器大多采用“分代收集”算法,根据对象存活周期的不同(1. 绝大部分的对象都是朝生夕死;2. 经过多次垃圾回收的对象就越难回收),一般把Java堆分为新生代和老年代,这样可以通过各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集算法都会有大批对象死去,只有极少量存活,一般选用复制算法,字需要付出少量对象的复制成本就可以完成收集。而在老年代因为对象的存活率高,且没有额外空间对它进行分配担保,就

2022-05-06 21:35:19 140

原创 内存分配策略

文章目录一、栈上分配二、对象优先在Eden区分配三、大对象直接进入老年代四、长期存活的对象将进入老年代五、动态对象年龄判定六、空间分配担保一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。Java的对象可以分为基本数据类型和普通对象。对于普通对象来说,JVM会首先在堆上创建对象,然后在其它地方使用的其实是它的引用。比如把这个引用保存在虚拟机栈的局部变量表中。对于基本数据类型来说(byte、short、int、long、float、d

2022-05-06 18:56:24 1120

原创 判断对象的存活及对象的引用

文章目录一、判断对象的存活1.1、引用计数算法1.2、可达性分析算法1.3、finalize方法1.4、方法区回收二、对象的引用2.1、强引用2.2、软引用2.3、弱引用2.4、虚引用一、判断对象的存活在堆里面存放着几乎所有的对象实例,垃圾回收器在对对进行回收前,要做的事情就是确定这些对象中哪些还是“存活”着,哪些已经“死去”(死去代表着不可能再被任何途径使用得对象了)1.1、引用计数算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器值就减1;任何时刻计数器为

2022-05-06 16:52:44 719

原创 对象的内存布局及访问定位

文章目录一、内存布局1.1、对象头1.2、实例数据1.3、对齐填充二、访问定位2.1、句柄2.2、直接指针一、内存布局在HotSpot虚拟机中,对象在内存中存储的布局可以分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。1.1、对象头对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。对象头的另外一部分是类型指针,即对象指向它的

2022-05-05 21:19:36 159

原创 对象的创建

文章目录一、检查加载二、分配内存2.1、分配方式2.1.1、指针碰撞2.1.2、空闲列表2.2、并发安全2.2.1、CAS 机制2.2.2、分配缓冲三、内存空间初始化四、设置五、对象初始化一个对象的创建在虚拟机中大致分为以下五步:一、检查加载当虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化。如果没有就必须先执行想要的类加载过程。二、分配内存接下来虚拟机将为新生对象分配内存。为对象分配空间的任务

2022-05-05 20:48:29 787

原创 内存溢出异常

文章目录一、栈溢出二、堆溢出三、运行时常量池溢出四、方法区溢出五、直接内存溢出六、Java异常在JVM的内存区域中介绍了JVM的内存区域,其中除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError异常的可能。一、栈溢出每个Java方法在被调用的时候,都会创建一个栈帧并入栈,那么这里我们直接无限调用递归方法,即可让虚拟机栈溢出。public class StackSOF { private int stackLength = 1; public

2022-05-05 14:11:27 493

原创 Java内存区域

文章目录一、简介二、运行时数据区域2.1、虚拟机栈2.1.1、局部变量表2.1.2、操作数据栈2.1.3、动态连接2.1.4、返回地址2.1.5、基于栈的字节码解释执行引擎2.2、程序计数器2.3、本地方法栈2.4、堆2.4.1、栈上分配2.5、方法区2.6、运行时常量池2.7、直接内存一、简介JVM全称Java Virtual Machine,也就是我们耳熟能详的Java虚拟机。它能识别 .class 后缀的文件,并且能够解析其指令,最终调用操作系统,完成我们想要的操作。如上图,一个Java程序,

2022-05-04 20:34:42 1006

原创 Linux安装Tomcat

文章目录一、下载指引二、安装说明三、防火墙及网络设置之前我们介绍了图解VMware及CentOS的安装以及SecureCRT连接虚拟机,那么这里我们就以此为基础来介绍Linux环境下如何安装Tomcat。一、下载指引首先我们需要去官网https://tomcat.apache.org下载一个Tomcat压缩包选择好对应版本点击进行下载二、安装说明首先我们可以借助SecureCRT来远程连接服务器,并将上述下载的文件上传至虚拟机(或者使用rz命令进行上传)使用tar –zxv

2022-02-15 02:03:42 4023 2

原创 Maven的依赖管理及环境激活

文章目录依赖管理环境激活依赖管理在项目中如果我们需要引入一个依赖,一般直接在官网https://mvnrepository.com查找,然后将其添加到maven的pom.xml文件中的<dependencies/>即可,如下:<!-- https://mvnrepository.com/artifact/junit/junit --><dependency> <groupId>junit</groupId> <arti

2022-02-13 21:44:04 644

原创 Maven的生命周期及插件开发

文章目录生命周期插件开发生命周期Maven有三套相互独立的生命周期,分别是clean、default 和 site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和maven最直接的交互方式就是调用这些生命周期阶段。如上图我们在mvn命令中也说了,其执行运行的阶段说明,这里再以clean生命周期为例,它包含的阶段有:pre-clea

2022-02-13 15:34:28 254

原创 Mac安装Git

文章目录一、简介二、下载指引三、配置信息一、简介在Mac上安装Git之前,可以先使用git --version来查看一下是否安装了Git,因为Mac系统可能自带了Git,或者在你安装XCode(或者XCode的命令行工具)时,可能已经安装了 Git。如果Mac还没有安装Git的话,则会跳出弹窗提示您安装Git。上述是因为在安装Homebrew时,自动下载安装了XCode的命令行工具,所以已经安装了Git。二、下载指引如果尚未安装Git,或者已安装的Git版本过低,这里我们可以去Git官网ht

2022-02-12 17:18:38 98228

原创 Windows安装Git

文章目录一、下载指引二、安装说明三、配置信息一、下载指引在Windows上使用Git,可以从Git官网https://git-scm.com/直接下载安装程序,然后按默认选项安装即可。Standalone Installer: 安装版,安装完之后会自动在鼠标右键时显示 Git GUI Here 和 Git Bash Here (推荐)Portable(“thumbdrive edition”): 绿色版,解压就能运行,免安装,不过绿色版不会在鼠标右键时显示 Git GUI Here 和 Gi

2022-02-12 15:26:21 4936

原创 表数据量较多及并发量较大时,如何修改表结构

现在假设一个场景:假设一个系统已经运行一段时间,数据量已经很大,这时候系统升级,有张表需要增加个字段,但是并发量白天晚上都很大,请问怎么修改表结构?修改表结构会导致表锁,数据量大修改数据很长,导致大量用户阻塞,无法访问该如何解决?首先创建一个和你要执行的alter操作的表一样的空的表结构。执行我们赋予的表结构的修改,然后copy原表中的数据到新表里面。在原表上创建一个触发器在数据copy的过程中,将原表的更新数据的操作全部更新到新的表中来。copy完成之后,用rename table 新表代替

2022-02-10 10:58:16 771

原创 ConcurrentLinkedHashMap

ConcurrentLinkedHashMap是Google团队提供的一个容器。它有什么用呢?其实它本身是对ConcurrentHashMap的封装,可以用来实现一个基于LRU策略的缓存。LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,淘汰掉最不经常使用的数据。我们在使用 ConcurrentLinkedHashMap 时,首先需要引入 concurrentlinkedhashmap-lru jar包,其下载地址:https://mvnrepos

2022-02-10 00:35:16 3391

原创 Java位运算符

文章目录一、示例详解1.1、~ 取反1.2、& 按位与1.3、| 按位或1.4、^ 按位异或1.5、<< 有符号左移1.6、>> 有符号右移1.7、>>> 无符号右移二、应用实例在计算机中所有数据都是以二进制的形式储存的,位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度较快。常见位运算符说明~取反&按位与|按位或^按位异或<<有符号左移>>

2022-02-10 00:00:20 1342

原创 Maven简介及基础操作

文章目录一、简介二、目录结构三、项目打包一、简介Maven是一个项目管理和整合工具。为开发者提供了一套完整的构建生命周期框架,Maven使得大部分的工程配置操作都非常简单并且可复用,在创建报告、检查、构建和测试自动配置时,Maven可以让开发者的工作变得更简单。二、目录结构至于Maven安装配置可见Mac安装JDK及Maven和Windows安装JDK及Maven,安装完成后我们就可以来新建一个Maven项目,如下:三、项目打包...

2022-02-09 22:14:48 299

原创 玩转双指针

滑动窗口——无重复字符的最长子串遍历循环滑动窗口滑动窗口优化给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s = “abcabcbb”输出:3解释:因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入:s = “bbbbb”输出:1解释:因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入:s = “pwwkew”输出:3解释:因为无重复字符的最长子串是 “wke”,所以其长度为 3。   请注意,你的答案

2022-02-09 11:19:45 847

原创 Git原理

文章目录简介blob对象tree对象commit对象分支信息简介对于Git大部分人都知道如何去使用它,知道有哪些命令,那么Git是如何储存信息的呢,这里我们可以先通过下图先来简单了解一下从上图中,我们看到.git/objects目录中存储的最主要的有三类对象:blob、commit、以及tree对象。其实Git中还有一个tag对象,但这并不是重点,我们先来介绍下上图中提到的三种对象。我们都知道每个Git仓库的所有数据都存储在仓库顶层路径下的.git目录下,这里我们可以新建一个项目来查看一下

2022-01-22 20:58:12 433

原创 Git远程仓库

文章目录一、添加远程仓库1.1、创建远程仓库1.2、关联远程仓库1.3、配置SSH密钥二、从远程仓库克隆2.1、创建远程仓库2.2、克隆远程仓库一、添加远程仓库之前我们仅仅是在本地创建了一个Git本地仓库,这里我们再在GitHub创建一个Git远程仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作开发。1.1、创建远程仓库首先登陆GitHub,然后在右上角找到“New repository”按钮,创建一个新的仓库在Repository

2022-01-20 21:29:14 4107

原创 分支管理及标签管理

文章目录一、分支管理1.1 分支简介一、分支管理1.1 分支简介在之前的Git简介及基础操作的版本回退中,我们其实可以发现每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。这里可以在git log命令中添加--graph来查看其分支图形。从上图来看,只有一条时间线,在Git里这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以HEAD指向的就是当前分支。一开始的时候,master分支是一条线,Git用maste

2022-01-19 21:19:18 518

原创 Git简介及基础操作

文章目录一、简介二、安装三、Git Flow四、Git操作4.1 创建版本库(git init)4.2 检查文件状态(git status)4.3 删除暂存(git rm --cached <file>...)4.4 忽略文件(.gitignore文件)4.5 提交本地版本库(git add <file>..., git commit -m "xxx")4.6 丢弃修改(git restore <file>..., git restore --staged <fil

2022-01-16 23:43:21 414

原创 环境搭建目录

文章目录Mac相关Windows相关Linux相关Mac相关Mac安装JDK及MavenMac安装HomebrewWindows相关Windows安装JDKWindows安装MySQL图解VMware及CentOS的安装SecureCRT连接虚拟机Linux相关Linux安装JDK及TomcatLinux安装MySQL...

2022-01-10 22:23:57 895

原创 Linux安装MySQL

文章目录一、下载指引二、远程连接(Mac用户)三、上传文件(Mac用户)四、安装及配置五、远程连接一、下载指引首先我们需要去官网下载一个MySQL压缩包,将其解压到我们想要安装的目录之下,下载地址为:https://www.mysql.com/downloads如果需要下载历史版本,可以在上图中的Archives中进行选择二、远程连接(Mac用户)之前在Linux安装JDK及Tomcat中,我们是使用的VMware的虚拟机来进行介绍的,其中借助了SecureCRT工具来完成远程连接服务器

2022-01-10 00:45:03 713

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除