- 博客(60)
- 问答 (1)
- 收藏
- 关注
原创 浅谈 JVM 的内存划分、类加载、垃圾回收机制
java程序在运行之前需要先编译(将 .java文件变成 .class文件(二进制字节码文件))java程序运行时,java进程(即 JVM)就会读取对应的 .class 文件,并且解析内容,在内存中构造出类对象,并进行初始化…类对象:描述了这个类是什么样的,类里包含哪些属性,这些属性的名字、类型,被什么修饰词修饰;类里包含哪些方法,这些方法的名字、类型是什么;还描述了这些类继承自哪个父类,实现了哪些接口。因此类对象也是创建实例的具体依据。类加载就是:将类从文件加载到内存中。
2024-07-26 18:50:13
364
原创 面向字节流传输数据
当提到“传输数据面向字节流”,这是指在网络通信中,数据被视作一连串的无结构字节,而不是按照特定的数据块或记录进行传输。这种传输方式是面向传输层协议(如TCP)的一个特性,它允许数据以连续的字节流形式在网络中传输,而不关心数据的含义或边界。
2024-07-09 22:52:32
176
原创 浅谈如何在linux上准备java环境并成功部署项目
但是由于我的云服务器使用的版本是 centos7,比较老版,所以没有tomcat8.x系列,一般新版的服务器都会有的。而 openjdk 是开源社区维护的开源版本,所以虽然 oracle 官方的 jdk 和开源社区的 jdk 不是同一个东西,但是他们相差不大,并且功能相互兼容。当我们将自己的项目部署到云服务器上时,首先需要让云服务器上的数据库中含有自己项目对应的数据库、表。因为我们项目之前建的数据库、表是在本地的,项目部署到云服务器上就需要让项目访问的是云服务器上的数据库、表。
2024-06-29 15:38:33
1239
1
原创 浅谈linux(1)
ls:列出当前目录下所有内容ls 后面跟上某个具体路径:可以查看指定目录内容ls -l : 可以以列表形式查看,缩写为 ll3)、pwd查看当前路径对应的绝对路径。就是查看当前位置。/root 就表示在当前根目录下有一个 root 目录,上面我们使用 ll 命令发现有很多目录,也有root目录,这表明我们每次登陆成功,都会默认在root目录下。4)、cd切换当前目录。cd 的效果,就相当于我们在windows上双击文件然后进到文件/目录里一样。cd / :切换到根目录。
2024-06-28 02:57:24
608
原创 浅谈Tomcat
Tomcat 就是一个 HTTP 服务器。前面我们聊了HTTP服务器,像我们在网页输入URL,其实就是在给人家的HTTP服务器发送请求,既然有HTTP服务器,那就肯定有HTTP客户端。HTTP客户端,就是我们日常使用的浏览器。我们自己也可以搭建一个HTTP服务器,其实就是搭建网站的 ”后端部分“,本质上就是写个 TCP socket 服务器。但是会比较麻烦,有许多重复性的工作。
2024-06-27 01:28:31
912
原创 浅谈网络通信(4)
为了反制运营商劫持保护网络上传输的数据安全,http 开始出现加密版本,即 https。加密和解密。1、明文:要传递的原始信息2、密文:对原始信息进行加工后,即使信息落入黑客手里,黑客也不知道是什么意思3、密钥: 进行加密、解密的关键。密文如何还原成明文,还需要靠这个密钥;如何将明文变成密文,也需要依靠密钥。4、加密:使用密钥将明文变成密文。5、解密:使用密钥将密文变成明文。6、对称加密:加密和解密使用同一个密钥7、非对称加密:加密和解密使用不同密钥。
2024-06-26 20:21:54
1002
原创 面试题4:POST 比 GET 安全?
我们知道 GET一般将参数放到URL的查询字符串中,如果是实现登录页面,我们的用户名和密码就直接显示到浏览器的地址栏中了,此时就会轻易的被他人获取账号密码,很不安全。而POST会把参数放到 body 里,不会直接显示在URL上,所以更安全。虽然把用户名密码这些参数放到URL上的确不好,但是放到POST的body里也不见得就是安全,抓个包,就能看到body的信息了。HTTPS具有一定加密功能,但是实践中,主要还是会通过业务上的代码来进行加密。一般我们提到的网络安全,指的是:数据被黑客截获之后。
2024-06-23 16:58:23
445
原创 面试题3:GET 和 POST 有什么区别?
2、发请求时,给服务器传递的数据,GET 一般是放在查询字符串中,但GET 也可以把数据放在 body 里。POST 一般是放在 body 中,但是也可以放在 查询字符串 中,虽然少见,但是浏览器是可以支持的。如果当前GET不是幂等的,就需要通过特殊技巧避免浏览器产生缓存(典型的技巧就是让每次GET请求的URL都不相同:即通过特殊的查询字符串来保证 URL 的不同)。设计服务器时,就需要提供一些接口,接口传入的参数,就视为是输入,接口返回的接口,就视为是输出。幂等:输入结果是确定的,输出结果也是确定的。
2024-06-23 15:50:39
350
原创 面试题2:从浏览器输入一个URL,到最终展示前端页面这一过程,会发生什么?
交换机会把数据分用到数据链路层(更上层的就不用解析了),再重新封装,继续转发。路由器会把数据分用到网络层(更上层的就不用解析了),再重新封装,继续转发,路由器根据数据报中的目的IP在路由表中匹配,找个合适的方向发出去,每次转发,TTL就 - 1。就像 github 的域名是 www.github.com,很好记,但是他的 IP 地址是 20.205.243.166,其实我们在地址栏中输入github的IP地址,也是能够访问到github网站的,但是因为IP地址不好记,所以一般地址栏里输入的都是域名。
2024-06-22 20:53:03
377
原创 面试题1:如何使用UDP来实现可靠传输?
该面试题主要考查的是 TCP,虽然问的是 UDP ,但考察的是TCP。即基于UDP,在应用层实现超时重传机制、确认应答机制、引入序列号…
2024-06-20 14:10:12
123
原创 浅谈网络通信(3)
因为假设单个数据报丢包的概率为10%,那么第一次丢包的概率是0.1,第二次丢包的概率是0.1 * 0.1 = 0.01,因此丢包的概率是逐渐减小的,所以第二次传输,大概可以顺利到达的,所以超时重传的时间是逐渐变大的。那如果第二次传输也没有到达,说明当前网络环境比较糟糕,那单个数据报丢包的概率可能非常大,甚至概率是100%的,断网了,都断网了,再怎么频繁的重传,也没用,所以把超时重传的频率降低一点(时间间隔长一点),至少可以节省主机的开销。主机B的系统内核里,记录了一个数据结构,包含了和他连接的对方信息。
2024-06-15 21:58:37
1055
原创 浅谈网络通信(2)
应用层这一层,有很多现成的协议,也有很多时候,需要我们程序员自己去自定义应用层协议。自定义应用层协议,也是一件很简单的事情。举个例子:此处有一个需求场景:一个外卖软件,需要在用户打开此软件时,给用户显示用户住址附近的商家列表,列表中有很多项,每一项都包含了一些信息:譬如:商家名称、商家图片、商家店铺好评率,商家与用户的距离、商家评分…(其实外卖软件和服务器之间的沟通,有很多种方式,展示商家列表,只是其中之一)客户端(用户…):需要给服务器发起一个请求,服务器收到请求之后,就给客户端返回一个响应。
2024-06-12 11:14:12
1231
原创 浅谈JDBC
JDBC是一种可用于执行SQL语句的JAVA API,是链接数据库和JAVA应用程序的纽带。JDBC一般需要进行3个步骤:与数据库建立一个链接、向数据库发送SQL语句、处理从数据库返回的结果。
2024-06-09 19:04:23
265
原创 浅谈Spring MVC
1、Spring MVC 也叫做 Spring Web MVC,是基于Servlet 构建的,(因此之前在Servlet中的写法在MVC中同样适用,比如Servlet中的常用对象: Request、Response 对象,在MVC中同样可以使用)。2、是一个Web框架(即MVC具备HTTP能力:可以支持HTTP协议,当我们从前端/浏览器通过ajax(ajax底层是HTTP)发起一个请求时,此时这个MVC就可以直接去响应;
2024-06-07 19:50:11
975
原创 浅谈SpringBoot配置文件
譬如说:有些学校的教务系统不需要去访问第三方智慧树APP来获取学生线上选修课的通过率,他们自己使用自己学校内部开发的APP,那么此时这些学校就不需要在配置文件里配置第三方智慧树APP的秘钥了。因此这个第三方秘钥也可以说是一种用户自定义的配置文件。
2024-06-01 18:58:07
909
原创 浅谈网络通信(1)
那么QQ自定义的应用层协议是啥样的?咱们不知道,只有开发者才知道,因此此处QQ自定义的应用层协议我们通过假设进行举例子。假设QQ的应用层协议是这样自定义的:发件人的QQ号、接收人的QQ号、时间、消息内容那么此时就需要将自定义好的应用层协议,
2024-05-26 20:36:42
1156
原创 多线程 —— 锁策略
锁策略,对于需要实现锁的程序员要重点掌握;对于普通的程序员,工作中很少会被要求实现一把锁,但普通的程序员会常常在代码中使用线程进行 “并发编程”,此时就会涉及到多线程,多线程会涉及到线程安全问题,线程安全问题就需要加锁进行解决。因此对于程序员来说,锁策略的知识点也需要掌握好。死锁:即在多线程或者多进程的环境下,两个或多个线程在执行过程中,由于争夺资源而造成的一种相互等待的现象,如果没有外力干涉,这些线程都将无法执行下去。
2024-05-24 11:39:49
658
原创 浅谈如何自我实现一个消息队列服务器(8)——编写客户端部分
6.2、如果响应是针对请求的响应,此时就将响应的payload解析出来,变成 BasicReturns ,根据 BasicReturns 里面的 channelId 在 channelMap里查询对应的 Channel 对象,如果 Channel 对象不存在,说明当前响应对应的客户端并不存在,直接抛异常,如果不为空,就将当前响应存入记录服务器返回响应的哈希表basicReturnsMap里,使用方法 putReturns(basicReturns)处理。(2)、服务器推送给客户端(订阅者)的消息。
2024-05-11 17:16:15
1002
2
原创 浅谈如何自我实现一个消息队列服务器(7)——编写服务器部分
再次拿出这张图,前面我们已经将重要概念:VirtualHost、exchange、msgQueue、message、binding 都实现了,此时就可以开始编写消息队列MQ的本体:BrokerServer (服务器),由于消息队列的服务器是一个基于 TCP 协议进行通信的服务器,因此消息队列的 BrokerServer 也叫做 TCP服务器。构造响应对象,设置好响应对象中的值,然后打印 rid、channelId、响应 type、响应 length。方便后续判断当前是哪个连接,连接中的哪一对请求、响应。
2024-05-10 17:13:48
1030
原创 多线程典型例子(4)——线程池
由于该线程池类 ThreadPoolExecutor 中的线程数并不是一成不变的,而是根据任务的情况动态变化(自适应),如果任务多,该线程池中的线程数就多一些(创建出来),任务少,该线程池中的线程数就少一些(多余的就销毁),但是此处的动态变化也并不是没有限制,因此ThreadPoolExecutor类的构造方法提供了几个不同含义的参数,来对线程池的动态变化产生一定限制。因此可以使用 线程池,提前创建好一些线程放在线程池中,后续需要使用线程时,直接从线程池中随取随用即可,当线程不再使用时,就放回池子里。
2024-05-09 23:39:39
883
原创 浅谈操作系统中的重要概念——线程(3)——设计模式
设计模式就相当于菜谱,有了菜谱/秘籍,就能够根据菜谱上的指引/步骤做出许多从前不会的美食,就算不会下厨的人,拥有了食谱,他的厨艺也能够得到提升和保障。因此设计模式就是程序员的菜谱,设计模式中介绍了许多典型场景,以及针对这些典型场景的处理办法。按照设计模式来写的代码不会很差,在一定的规范范围里。设计模式有很多种,不止23种,今天主要介绍两种常见、常用的:1、单例模式2、工厂模式工厂,顾名思义是用来生产的。那么对应到我们代码上,工厂模式就是用来生产对象的。那么具体是怎么进行生产对象的呢??
2024-05-07 19:26:49
949
原创 多线程典型例子(3)——定时器
定时器:是日常开发中常见的组件,前端/后端都常用到。类似于一个闹钟:等待一定的时间后,执行某个任务。Java中对于定时器的使用提供了标准库中的Timer类(来自于java.util 包下的类 )。/*** 自我实现一个定时器* 实现思路:* 先描述,后组织。* 1、先要能够将一个任务描述出来* 2、使用一定的数据结构将多个任务 TimerTask 组织起来* 创建一个 TimerTask 这样的类表示要执行的任务,类里表示任务执行的内容,以及任务的实际执行时间。
2024-05-05 21:14:07
116
原创 浅谈操作系统中的重要概念——线程(2)
该篇文章继续重点介绍关于线程的使用,对于Java程序员来说,掌握线程的知识是非常必要的,不仅笔试面试中会用到,实际工作中更会用到。
2024-04-29 20:20:57
649
3
原创 浅谈操作系统中的重要概念——线程(1)
最初是尝试在创建进程时,只给进程分配一个简单的PCB,而不去分配后续进程运行时所需的系统资源,此时这类进程称作——轻量级进程(也叫做 线程 Thread),但是这样的尝试还是出现一个问题:线程创建出来,也是为了到cpu上执行,完成相关任务的。刚创建出来的进程,可以视为是一个只包含一个线程的进程(此时创建的过程需要分配资源,因此此时第一个线程创建的开销就可能比较大,后面再在这个进程里创建的线程,直接服用当前进程的资源,开销就比较小)一个进程中的前台线程都结束了,后台线程还没执行完,也会跟着进程的结束而退出。
2024-04-27 21:22:11
933
原创 浅谈在Java代码中创建线程的多种方式
第一种创建线程的方式就是:自定义一个类,并且使该类继承自Java标准库 Thread 类,此时自定义的类需要重写 run() 方法。注意:重写的 run() 方法,要处理异常时,只能 try {} catch (),并不能 throws,这是因为 Thread 类中的 run() 方法并没有throws xxx这样的设定。重写的 run() 方法里书写的逻辑代码就是我们创建出来的新线程,所要执行的任务。
2024-04-27 21:19:57
856
1
原创 浅谈操作系统中的重要概念——进程
以 .exe 为后缀的可执行文件就是一个程序,一般是存储在硬盘上的。上图中,我们可以看到 QQ.exe 就是一个以.exe 为后缀的可执行文件,因此他就是一个程序,应用程序;图中其他以.exe结尾的文件,其类型也是应用程序。程序在没有双击运行时,是静态的存放在硬盘上的,此时并不会消耗系统资源。正在运行的程序就是进程。譬如说:QQ这个程序没有运行时,以 .exe 作为后缀的文件静态的存放在硬盘上,并没有运行。双击运行时,同一个程序,可以产生多个进程。
2024-04-25 21:34:05
888
1
原创 浅谈 操作系统
操作系统 其实就是一个软件(software)。是一个用来进行管理的软件。进行什么样的管理呢?操作系统一般由 内核 + 配套的程序 组成。内核即一个系统最核心的功能:对下,能够管理好各种硬件设备;对上,能够为各种程序提供稳定的运行环境。
2024-04-25 12:26:21
272
1
原创 浅谈如何自我实现一个消息队列服务器(6)—— 网络通信设计
既然是进行网络通信,那必然既会有 请求,也会有 响应。此处我为了简化项目代码,便将请求、响应 的协议格式设成一致。请求格式:响应格式:接下来来简述一下请求、响应里的3部分,分别是什么意思。type:描述当前 请求 和 响应 分别是干什么的。
2024-04-23 18:46:47
1014
原创 浅谈 StringTokenizer 类
最近在编写代码时以及在 牛客、leetcode 上刷题时,有时候会遇到需要对一个字符串进行几部分的截取 这样的需求场景。一般我都是使用 字符串 String 类自带的 split()方法 进行截取字符串,不过由于这个 split()方法 里传入的参数比较特殊,其传入的参数需要是正则表达式。譬如说:当前有个字符串 x = “aaa\tbbb\tccc”,我希望以 \t 为分隔符,将 x 截取,分成好几个字符串子串。
2024-04-21 17:21:26
1070
原创 浅谈 刷算法题时遇到运行超时异常 的解决办法
最近在牛客、leetcode 刷算法题时发现一个奇怪的问题,明明解题思路、所用算法与题解一致,并且在本地IDE运行是通过的,但是在牛客、leetcode 却没办法AC,出现一个叫做 运行超时 的异常。通过查阅资料、反复验证之后,找出了一个有效的解决办法。
2024-04-20 21:09:08
1123
原创 浅谈在 java 中如何从控制台输入一个字符
在 leetcode 上练习算法题时,题目要求输入一个浮点型数值以及一个字符。当我书写Scanner sc = new Scanner(System.in)后,打算通过sc.nextXX实现从控制台输入一个字符时,突然意识到原来Java语法中的Scanner类并没有直接定义读取 char 的方法。由于之前也并没有遇到过需要从控制台输入一个字符的需求场景,因此此时就对如何输入一个字符的问题绞劲脑汁,终于整理出了几种方法,实现从控制台输入字符。
2024-04-19 19:36:42
451
原创 浅谈如何自我实现一个消息队列服务器(5)—— 实现9个核心API中的basicComsume()
1)、自定义一个接口。2)、该接口中只能含有1个方法。3)、该接口必须添加注解 @FunctionInteface 后才能使用此时,我们在 common 包下创建一个 Comsumer 接口,作为我们的 回调方法,同时 Comsumer 回调接口中定义一个 handleDelivery()用来消费消息。
2024-04-10 23:29:28
779
原创 查看MySQL版本的方式
但其实通过连接上mysql客户端服务器的方式去查看 mysql版本的方式,其实有点叫做多此一举,因为当我们输入用户名、密码连接上mysql时,其提示信息已经给出了mysql的版本。这个方法适用于已经成功运行了mysql的童鞋。(注意了,此时的V是个大写的V)
2024-04-05 18:45:23
4258
1
原创 浅谈如何自我实现一个消息队列服务器(4)—— broker server部分使用virtualHost进行整合
因为不同的交换机类型,其转发消息到队列中的转发规则不一样。5)、(获取到队列名之后,查看当前队列是否存在,存在,就构造一个消息对象,再判定一下该消息是否存在,不存在,抛异常,存在,下一步。2)、如果不存在,先对bindingKey进行合法性校验,如果bindingKey不存在,抛异常,如果bindingKey合法,创建Binding对象,然后再判定一下Exchange和MSGQueue是否都存在,如果其一不存在,都需要抛异常,如果存在,3)、判定交换机、队列是否都是持久化,是的话就写硬盘,然后再写内存。
2024-04-03 08:51:18
694
原创 使用IDEA中的 Find Usages
在上述的图片中,我选中了一个方法,右键选择 Find Usages ,点击之后即可看到此方法,究竟被几个地方进行引用。使用IDEA中的 Find Usages ,能够查看某个方法、变量,在哪个地方进行了引用。
2024-04-01 21:18:42
474
空空如也
pta程序设计题,请大家解答
2021-11-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人