基本介绍JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···
JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作。
那我们的 JVM 是不认识文本文件的,所以它需要一个 编译 ,让其成为一个它会读二进制文件的 HelloWorld.class
如果 JVM 想要执行这个 .class 文件,我们需要将其装进一个 类加载器 中,它就像一个搬运工一样,会把所有的 .class 文件全部搬进 JVM 里面来。
方法区 是用于存放类似于元数据信息方面的数据的,比如类信息,常量,静态变量,编译后代码···等
类加载器将 .class 文件搬过来就是先丢到这一块上
堆 主要放了一些存储的数据,比如对象实例,数组···等,它和方法区都同属于 线程共享区域 。也就是说它们都是 线程不安全 的
栈 这是我们的代码运行空间。我们编写的每一个方法都会放到 栈 里面运行。
我 ...
内存模型1.JVM的内存模型介绍一下根据 JDK 8 规范,JVM 运行时内存共分为虚拟机栈、堆、元空间、程序计数器、本地方法栈五个部分。还有一部分内存叫直接内存,属于操作系统的本地内存,也是可以直接操作的。
JVM的内存结构主要分为以下几个部分:
程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。相当于指针,如果线程执行的是 Native 方法,计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域,生命周期与线程相同。
Java 虚拟机栈:每个线程都有自己独立的 Java 虚拟机栈,生命周期与线程相同。每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。可能会抛出 StackOverflowError 和 OutOfMemoryError 异常。
本地方法栈:与 Java 虚拟机栈类似,主要为虚拟机使用到的 Native 方法服务,在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。本地方法执行时也会创 ...
名词解释1.ARP**ARP(地址解析协议)用于根据 IP 地址获取对应的 MAC 地址,是主机通信前必须完成的地址解析步骤;RARP(逆地址解析协议)则相反,用于根据已知的 MAC 地址获取 IP 地址,常用于无盘工作站启动时向网络请求 IP。ARP 常见于局域网通信,RARP 已被 DHCP 等协议取代。
其中的单播和广播
2.CDN*内容分发网络,用于将内容缓存至离用户更近的节点,提高访问速度、降低延迟。
3.CSMA载波监听多路访问,用于以太网的介质访问控制方式,通过“监听-发送”机制减少冲突。
4.CRC*循环冗余校验,链路层常用的差错检测机制,能发现传输过程中的数据错误。
5.CSP内容安全策略,用于防止 XSS 等网页攻击,浏览器通过该策略限制网页资源加载来源。
6.MAC*媒体访问控制地址,是网卡的物理地址,也指链路层控制子层,用于网络访问管理。
7.MAN城域网,覆盖城市范围的计算机网络,规模介于局域网(LAN)和广域网(WAN)之间。
8.MTU*最大传输单元,指网络层一次能够传输的最大数据报长度,影响分片与传输效率。
9.NAT*网络地址转换,用于将私有 IP 映 ...
概念1.数组与集合区别,用过哪些?数组和集合的区别:
数组是固定长度的数据结构,一旦创建长度就无法改变,而集合是动态长度的数据结构,可以根据需要动态增加或减少元素。
数组可以包含基本数据类型和对象,而集合只能包含对象。
数组可以直接访问元素,而集合需要通过迭代器或其他方法访问元素。
我用过的一些 Java 集合类:
ArrayList: 动态数组,实现了List接口,支持动态增长。
LinkedList: 双向链表,也实现了List接口,支持快速的插入和删除操作。
HashMap: 基于哈希表的Map实现,存储键值对,通过键快速查找值。
HashSet: 基于HashMap实现的Set集合,用于存储唯一元素。
TreeMap: 基于红黑树实现的有序Map集合,可以按照键的顺序进行排序。
LinkedHashMap: 基于哈希表和双向链表实现的Map集合,保持插入顺序或访问顺序。
PriorityQueue: 优先队列,可以按照比较器或元素的自然顺序进行排序。
2.说说Java中的集合?
List是有序的Collection,使用此接口能够精确的控制每个元素的插入位置,用户能根据 ...
线程池1.线程池用过没有? 说说他的核心参数?线程在正常执行或者异常中断时会被销毁,如果频繁的创建很多线程,不仅会消耗系统资源,还会降低系统的稳定性,一不小心把系统搞崩了。
使用线程池可以带来以下几个好处:
线程池内部的线程数是可控的,可以灵活的设置参数;
线程池内会保留部分线程,当提交新的任务可以直接运行;
方便内部线程资源的管理,调优和监控;
为了减少频繁的创建线程和销毁线程带来的性能损耗
首先,所有任务的调度都是由execute方法完成的,这部分完成的工作是:检查现在线程池的运行状态、运行线程数、运行策略,决定接下来执行的流程,是直接申请线程执行,或是缓冲到队列中执行,亦或是直接拒绝该任务。其执行过程如下:
首先检测线程池运行状态,如果不是RUNNING,则直接拒绝,线程池要保证在RUNNING的状态下执行任务。
如果workerCount < corePoolSize,则创建并启动一个线程来执行新提交的任务。
如果workerCount >= corePoolSize,且线程池内的阻塞队列未满,则将任务添加到该阻塞队列中。
如果workerCount >= ...
sql
未读主从同步1.MySQL 主从架构有什么优缺点?MySQL Replication 是 MySQL 官方提供的主从同步方案,用于将 MySQL 主库的数据同步到从库中,从库可以供应用程序读取数据。
Replication 是目前 MySQL 使用最多的灾备方案,主要有 3 个作用:
读写分离,写主库读从库。这样大大降低主库的负载,即使主库出现类似锁表之类的情况,也不影响应用读取数据。
实现灾备,当主库发生故障时,可以方便地把从库切换成主库,实现高可用(HA)。
水平扩展,当应用访问量导致数据库 I/O 高时,可以通过水平扩展的方式将降低单机负载,降低磁盘 I/O。
同步原理:
MySQL 通过 binlog 实现同步过程中,会用到 3 个线程:
IO thread: 从库执行 START SLAVE 语句时,会创建一个 IO thread,负责连接主节点,请求更新的 binlog**,接收到 binlog 后写入 relaylog;**
dump thread:主库接收到从库的 binlog 请求后,创建一个 dump thread,把 binlog 同步给从库;
sql thre ...
1、 课程设计目的
本课程设计旨在实现一个基于 TCP 协议 的文件传输系统,模拟实际网络传输过程,并结合多种文件存储方案,完成文件接收与保存的后端处理。通过该系统,学生能深入理解:
基于 Socket 的 TCP 通信原理;
文件传输协议的设计与实现;
网络编程中数据流的处理方式;
结合 Spring Boot 完成服务模块封装;
将传输后的文件按需保存至本地或云存储系统。
使用git进行代码的版本管理和代码托管
项目的github地址:https://github.com/mengnankkkk/tcp-file-transfer
2、课程设计要求
实现 TCP Server,持续监听客户端连接,接收文件数据流;
设计传输协议,确保文件名、大小、内容等完整接收;
实现服务端文件保存功能,支持多种存储后端(本地 / 腾讯云 / 阿里云 / MinIO);
文件传输完成后记录文件元信息(文件名、时间);
提供文件列表接口(/files)供前端查看已上传文件;
使用 Java + Spring Boot 构建后端服务,模块清晰,便于扩展;
3、相关知识
Socket 编程:Java 中 ...
基础语法数据类型java中有8种基本类型:
byte, short, int, long, float, double, boolean, char
还有引用类型
类、数组、接口等。
比如String就是引用类型。引用类型的默认是 null
类型
位数
默认值
包装类
byte
8
0
Byte
short
16
0
Short
int
32
0
Integer
long
64
0L
Long
float
32
0.0f
Float
double
64
0.0d
Double
char
16
‘\u0000’
Character
boolean
1
false
Boolean
浮点数的默认类型是double 赋给 float 需加 f 后缀。精度变小
byte是循环的,满了128就从-128开始
double和long都是默认占64位的存储空间
long用于存储整数值,范围为-2^63^到 2^63^-1,double用于存储浮点数,遵循IEEE 754标准。
基本数据类型和引用类型的主要区别在于:
基本类型变量存储的是实际的数据值 ...
基础面试题目概念1.说一下Java的特点平台无关性:Java的编写一次,运无不在”哲学是其最大的特点之一。Java编译器将源代码编译成字节码(bytecode),该字节码可以在任何安装了Java虚拟机(JVM)的系统上运行。面向对象:JaVa是一严格的面可对象编程语言,几乎一切都是对象。面可对象编程(OOP)特性使得代码更易于维护和重用,包括类(class)、对象(object)、继承(inheritance)、多态 (polymorphism)、抽象(abstraction)和封装(encapsulation)。内存管理:JaVa有目己的垃圾回收机制,目动管理内存和回收不再使用的对象。这样,开发者不需要手动管埋内存,从而减少内存泄漏和其他内存相关的问题。
2.Java 的优势和劣势是什么?首先,Java的优势,我记得跨平台应该是一个大点,因为JVM的存在,一次编写到处运行。然后面向对象,这个可能也是优势,不过现在很多语言都支持面向对象,但是Java的设计从一开始就是OOP的。还有强大的生态系统,比如Spring框架,Hibernate,各种库和工具,社区支持大,企业应用广泛。另外,内 ...
基础1.详细的说说Redis的数据类型redis中常用的五种数据结构:string、list、set、zset、hash。
String结构底层是一个简单动态字符串,支持扩容,存储字符串。所以可应用于微信文章的阅读数或点赞,缓存对象、常规计数、分布式锁、共享 session 信息等。
list存储线性有序且可重复的元素,底层数据结构可以是双向链表/压缩列表。微薄的粉丝列表或好友列表,消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等。
set存储不可重复的元素,一般用于求交集、差集等,底层数据结构可以是hash和整数数组,所以可应用于抽奖,通过sadd添加不同的用户,srandom key number选出中将用户。还有集合的运算:sdiff、sintern与sunio就是集合的差交并运算,所以可应用于QQ的共同好友 聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。
zset存储的是有序不可重复的元素,zset为每个元素添加了一个score属性作为排序依据,底层数据结构可以是ziplist和跳表,所以可应用于排行榜,类 ...
java
未读相向双指针两个指针 left=0, right=n−1,从数组的两端开始,向中间移动,这叫相向双指针。上面的滑动窗口相当于同向双指针。
344. 反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
1234567891011class Solution344{ public void reverseString(char[] s){ int n = s.length; for (int left=0,right=n-1;left<right;left++,right--){ char tmp = s[left]; s[left] = s[right]; s[right] = tmp; } }}
简单的双指针解决
就是让头和尾互换值就ok了
125. 验证回文串如果 ...
前置知识JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!
进程:一个运行中的程序的集合; 一个进程往往可以包含多个线程,至少包含一个线程
Java默认有几个线程? 两个 main线程 gc线程
线程:线程(thread)是操作系统能够进行运算调度的最小单位。
并发(多线程操作同一个资源,交替执行)CPU一核, 模拟出来多条线程,天下武功,唯快不破,快速交替并行(多个人一起行走, 同时进行)CPU多核,多个线程同时进行 ; 使用线程池操作
线程实现主要分为三类:用户级线程(ULT)、内核级线程(KLT)和混合型线程实现。
线程实现主要分为三类:用户级线程(ULT)、内核级线程(KLT)和混合型线程实现。轻量级进程(LWP)不是线程的实现方式,而是操作系统内核用来支持线程运行的一种机制。
分析三种线程实现方式:
\1. 用户级线程(ULT):- 线程的创建、调度和管理都由用户程序完成- 操作系统对线程一无所知- 优点是切换开销小,缺点是无法利用多处理器
\2. 内核级线程(K ...