做婚礼网站的公司简介,小程序自助建站,博客网站推广,网站如何做excel预览1 OS
1.1 堆和栈的区别#xff0c;什么时候用到堆#xff0c;什么时候用到栈呢
堆和栈是两种不同的内存分配方式#xff0c;它们在计算机编程中有着各自的用途和特点。以下是它们之间的主要区别以及在何时使用它们#xff1a;
1.1.1 堆#xff08;Heap#xff09;什么时候用到堆什么时候用到栈呢
堆和栈是两种不同的内存分配方式它们在计算机编程中有着各自的用途和特点。以下是它们之间的主要区别以及在何时使用它们
1.1.1 堆Heap
定义堆是一个用于动态分配内存的区域它的大小不是在编译时确定的而是在运行时动态分配的。生命周期堆上的内存分配的生命周期由程序员控制。当不再需要某块内存时必须显式地释放它否则可能会导致内存泄漏。分配方式使用如malloc()、calloc()、new等函数在堆上分配内存。访问速度相对于栈来说访问堆上的内存通常较慢。用途当需要大量的内存或者不确定所需内存的大小时通常会使用堆。例如存储大型数据结构、动态数组等。
1.1.2 栈Stack
定义栈是一个用于存储局部变量和函数调用信息的内存区域。它遵循后进先出LIFO的原则。生命周期栈上的内存分配的生命周期是自动的。当函数返回时其局部变量会自动从栈上弹出并释放。分配方式当声明一个局部变量时它会自动在栈上分配内存。访问速度访问栈上的内存通常比访问堆上的内存更快。用途用于存储函数的局部变量、函数参数和返回地址。
1.1.3 什么时候使用堆和栈
使用堆当你需要动态分配内存或者需要在函数调用之间保留数据时应该使用堆。例如创建一个动态数组或链表。使用栈当你只在函数内部使用数据并且不需要在函数返回后保留这些数据时应该使用栈。例如函数的局部变量。
总之选择使用堆还是栈取决于你的具体需求如数据的生命周期、内存的大小和访问速度等因素。
1.2 JAVA中有没有一些场景是强行把本身在栈里面的分配的对象放到堆里面呢
在Java中对象的分配始终是在堆上进行的而不是在栈上。栈上主要存储的是基本数据类型如int、char、float等的值以及对象引用但不是对象本身。因此你不需要也不能强行将在栈上分配的对象移动到堆上因为对象本身从一开始就是在堆上分配的。
但是Java中有一个与此相关的概念即逃逸分析。逃逸分析是JVM的一种优化技术用于确定对象的作用范围和生命周期。如果JVM通过逃逸分析确定某个对象只在一个方法内部使用并且不会被外部引用那么JVM可能会选择在栈上分配这个对象而不是在堆上。这种优化可以减少垃圾收集的开销。但这并不是程序员显式控制的而是JVM的内部优化。
总之Java程序员不需要担心对象是在堆上还是栈上分配的因为这是由JVM自动管理的。但了解这些概念和背后的机制对于编写高效的Java代码是有帮助的。 1.3 TLAB对于线程的作用
TLABThread-Local Allocation Buffer是Java HotSpot虚拟机中的一个优化技术用于提高对象分配的速度。以下是TLAB对于线程的作用和相关的详细解释
1. 提高对象分配速度
在多线程环境中多个线程可能同时尝试在堆上分配对象。为了确保内存分配的正确性这些线程需要在分配对象时进行同步这可能会导致性能开销。TLAB的引入旨在减少这种同步开销。每个线程都有自己的TLAB这是堆内存中的一个小片段用于该线程的对象分配。由于TLAB是线程局部的线程在分配对象时不需要进行同步从而大大提高了对象分配的速度。
2. 减少锁竞争
由于每个线程在其自己的TLAB中分配对象所以减少了线程之间的锁竞争。这对于高并发应用程序来说是非常有益的因为它可以减少线程之间的争用和上下文切换从而提高整体性能。
3. 提高缓存局部性
由于TLAB是连续的内存区域并且是线程局部的所以它可以提高CPU缓存的局部性。当线程在其TLAB中分配和访问对象时这些对象可能位于相同的CPU缓存行中从而提高缓存命中率。
4. 动态调整
JVM会根据应用程序的行为动态调整TLAB的大小。如果一个线程频繁地分配对象其TLAB可能会被调整得更大从而减少溢出的可能性。相反如果一个线程很少分配对象其TLAB可能会被调整得更小从而减少内存浪费。
5. 垃圾收集的影响
由于TLAB是在Young Generation年轻代中分配的所以它们会受到Minor GC的影响。但是由于TLAB的存在对象分配和回收都变得更加高效从而可能减少GC的开销。
总之TLAB是Java HotSpot虚拟机中的一个重要优化技术它可以提高对象分配的速度减少锁竞争提高缓存局部性并对垃圾收集产生积极的影响。
1.4 在java的场景里传参是值还是引用的一个传递呢
答如果传递的是基本数据类型属于值传递如果传递的是对象那么就是引用如果传递的是不可变变量比如StringIntegerLong类型的变量传递的也是值
在Java中方法参数的传递方式经常引起混淆。让我们详细解释一下 基本数据类型当你传递一个基本数据类型如int、char、float、boolean等给一个方法时你传递的是该值的一个拷贝。这意味着方法内对参数的任何修改都不会影响到原始变量。这被称为值传递。 对象引用当你传递一个对象给一个方法时你实际上传递的是对象引用的一个拷贝而不是对象本身。这意味着你可以在方法内修改对象的状态即其字段的值并且这些修改会反映到原始对象上。但是如果你让引用指向一个新的对象原始引用不会改变。这经常被误解为“引用传递”但实际上更准确地说这是引用的值传递。 不可变对象像String、Integer、Long等类的实例是不可变的。这意味着一旦创建了这些对象就不能修改它们的状态。当你传递一个不可变对象给一个方法时你传递的是该对象引用的一个拷贝。由于对象是不可变的所以你不能在方法内修改它的状态。但是你可以让引用指向一个新的对象这不会影响到原始引用。因此尽管传递的是引用的拷贝但由于对象的不可变性这在实际效果上类似于值传递。
总结在Java中无论是基本数据类型还是对象引用方法参数的传递方式始终是值传递。但由于对象引用的特性这种传递方式可能会产生与传统的值传递不同的效果。 2 数据结构
2.1 用到比较多的一些数据结构有哪些呢
hasmaplist
2.2 介绍一下map的扩容和底层原理
2.3 hashMap在针对并发的场景去解决呢
答concurrentHashMap的原理
3 redis
3.1 你应用分布式锁的实践
答解决缓存击穿、秒杀系统的超卖问题
3.2 redis的缓存雪崩、击穿、穿透问题的解决方案
3.3 对于你说用布隆过滤器解决缓存穿透问题的方案如果说数据的存在与否是动态变化的这10分钟存在后面10分钟又不存在呢
布隆过滤器是一个概率型数据结构用于判断一个元素是否在一个集合中。它的主要优点是空间效率和查询时间都非常高但它存在一定的误判率即可能会认为某个不存在的元素存在但不会误判存在的元素为不存在。
当使用布隆过滤器来解决缓存穿透问题时我们通常先查询布隆过滤器来检查某个键是否可能存在。如果布隆过滤器表示该键不存在则直接返回不再查询数据库如果布隆过滤器表示该键可能存在则继续查询缓存或数据库。
但是如果数据的存在与否是动态变化的布隆过滤器会面临一些挑战
数据的添加当数据添加到数据库时相应的键可以被添加到布隆过滤器中这是简单的。数据的删除布隆过滤器本身不支持删除操作。如果数据从数据库中删除布隆过滤器中的相应键仍然存在。这意味着即使数据已经不存在布隆过滤器可能仍然表示它存在导致不必要的数据库查询。
对于动态变化的数据有以下几种策略可以考虑
定期重建定期例如每10分钟、每小时重建布隆过滤器以确保它反映了最新的数据状态。使用Counting Bloom Filter这是布隆过滤器的一个变种它支持删除操作。但它需要更多的空间并且可能仍然存在误判。结合TTL对于缓存和布隆过滤器中的条目可以设置一个TTL生存时间。当条目过期时可以从缓存中删除并在下次重建布隆过滤器时不再包括它。双布隆过滤器使用两个布隆过滤器一个为当前的另一个为上一个时间段的。当数据变化时新数据添加到当前的布隆过滤器中。查询时两个布隆过滤器都被检查。定期切换这两个布隆过滤器的角色并重建旧的布隆过滤器。
总的来说布隆过滤器是一个强大的工具但在动态数据环境中使用时需要考虑其局限性和可能的策略。
3.4 布隆过滤器本身不支持删除操作为什么
布隆过滤器的工作原理是基于多个哈希函数。当你想将一个元素添加到布隆过滤器中时这个元素会被多个哈希函数处理每个哈希函数都会生成一个位置索引然后将这些位置的位标记为1。因此一个元素的加入可能会影响布隆过滤器中的多个位。
当检查一个元素是否在布隆过滤器中时同样使用这些哈希函数来获取位置索引并检查这些位置的位是否都为1。如果都为1那么元素可能在布隆过滤器中注意是“可能”因为存在误判率如果有任何一个位不为1那么元素肯定不在布隆过滤器中。
现在考虑删除操作。如果你想从布隆过滤器中删除一个元素理论上你可以使用相同的哈希函数找到位置索引并将这些位置的位设置为0。但这样做有一个问题由于布隆过滤器的特性一个位置的位可能被多个元素共同设置为1。如果你简单地将一个元素的位设置为0你可能会误删其他元素的位从而破坏布隆过滤器的正确性。
因此由于这种多个元素可能共同影响同一位的特性布隆过滤器本身不支持删除操作。如果数据从数据库中删除布隆过滤器中的相应键仍然存在这可能导致布隆过滤器误判该数据仍然存在从而导致不必要的数据库查询。
3.5 当数据添加到数据库时相应的键可以被添加到布隆过滤器中这是简单的。 如何添加
当数据添加到数据库时如果你想将相应的键也添加到布隆过滤器中可以按照以下步骤进行 选择哈希函数布隆过滤器依赖于多个哈希函数。这些哈希函数应该是独立的并且能均匀地散列数据到布隆过滤器的位数组中。常见的哈希函数有MurmurHash、SHA-256等。 哈希处理将要添加的键通过每一个哈希函数进行处理。每个哈希函数都会为这个键生成一个整数值这个值对应于布隆过滤器位数组中的一个位置。 设置位根据每个哈希函数生成的位置索引将布隆过滤器位数组中的相应位置设置为1。如果某个位置已经是1那么保持不变。
例如假设我们有一个长度为10的布隆过滤器位数组实际应用中布隆过滤器的大小通常会更大并且我们使用了两个哈希函数。当我们想添加一个键“key”时
哈希函数1处理“key”并返回位置2。哈希函数2处理“key”并返回位置5。我们将位数组中的位置2和位置5设置为1。
这样“key”就被添加到了布隆过滤器中。当我们后续查询“key”是否在布隆过滤器中时只需检查位置2和位置5是否都为1。如果都为1那么“key”可能在布隆过滤器中如果有任何一个位不为1那么“key”肯定不在布隆过滤器中。
需要注意的是由于布隆过滤器的误判率即使位置2和位置5都为1也不能100%确定“key”确实在布隆过滤器中只能说“key”可能在其中。但如果有任何一个位不为1那么可以确定“key”肯定不在布隆过滤器中。 3.6 4 计算机网络
4.1 讲讲tcp的关闭过程需要四次挥手
答
4.2 如何改造成三次挥手关闭呢
TCP协议使用四次挥手来终止一个连接。这是为了确保双方都能独立地关闭其连接的一侧。如果要改造成三次挥手可能会牺牲某些安全性或可靠性。但从理论上讲如果我们确实想要三次挥手
第一次挥手客户端发送一个终止请求给服务器。第二次挥手服务器回应确认收到终止请求并同时发送自己的终止请求。第三次挥手客户端确认服务器的终止请求。
这种方法的问题是它假设在第二次和第三次挥手之间服务器不会发送任何新的数据。在实际的TCP协议中四次挥手确保了即使在终止过程中仍有数据在传输连接也能被安全地关闭。
4.3 HTTP2.0 多了哪些特点和优势
HTTP/2是HTTP/1.x的直接后继者它引入了许多改进和新特性旨在提高性能和效率。以下是HTTP/2的主要特点和优势 多路复用在一个单一的TCP连接上可以同时发送多个请求和响应消息而不需要按照顺序一个接一个地进行。这减少了延迟并提高了加载速度。 头部压缩HTTP/2使用HPACK压缩格式减少了请求和响应消息头的大小从而减少了传输的数据量。 服务器推送服务器可以“推送”资源到客户端即在客户端明确请求之前就发送资源。这可以加速页面加载。 优先级和权重客户端可以设置请求的优先级和权重从而告诉服务器哪些资源更重要应该优先发送。 二进制格式HTTP/2消息使用二进制格式这使得它们更易于解析更高效更少出错与HTTP/1.x的文本格式相比。 流量控制HTTP/2为每个流提供了流量控制从而允许更细粒度的控制数据传输。 更安全虽然HTTP/2本身并不强制使用TLS但在实际应用中大多数浏览器要求HTTP/2连接必须使用TLS。 减少了协议开销由于多路复用、头部压缩等特性HTTP/2减少了协议的开销从而提高了性能。
总的来说HTTP/2引入了许多新特性和改进旨在提供更快、更高效、更可靠的Web体验。
4.3.1 http2.0有推出断点续传的功能嘛我记得是加了一个帧字段的
是的HTTP/2.0 对断点续传的支持得益于其引入的帧结构特别是其中的 RST_STREAM 帧。
在 HTTP/2 中通信是基于帧的每个帧都属于某个特定的流。流是连接中的一个双向字节序列可以承载一个或多个消息。RST_STREAM 帧允许对一个流进行中止但并不关闭流。这为实现断点续传提供了可能。
当客户端或服务器需要中断某个特定的流但不想关闭连接时可以发送一个 RST_STREAM 帧。后续如果需要重新开始传输可以使用新的流 ID 重新开始而不必重新建立连接。
但要注意虽然 RST_STREAM 可以用于实现断点续传的某些场景但 HTTP/2 本身并没有为断点续传定义特定的机制。实际的断点续传实现仍然依赖于如 Range 和 Content-Range 等 HTTP 头部字段。
总的来说HTTP/2 的帧结构和流控制为更高效的断点续传提供了更多的可能性但具体的实现仍然需要依赖于应用层的逻辑。
4.3.2 流量控制HTTP/2为每个流提供了流量控制从而允许更细粒度的控制数据传输。这里的每一个流是指http请求传输的数据量嘛还是单个tcp连接
在HTTP/2中流量控制是基于“流”的概念实现的。这里的“流”并不是指HTTP请求传输的数据量也不是单个TCP连接而是HTTP/2协议中的一个抽象概念。
在HTTP/2中一个“流”是指一个双向的字节序列它属于一个已建立的TCP连接。一个TCP连接中可以有多个并发的流每个流都有一个唯一的整数标识符。这些流可以用来并发地传输多个HTTP请求和响应而不需要建立多个TCP连接。这就是HTTP/2的多路复用特性。
流量控制在HTTP/2中是为每个流实现的而不是为整个TCP连接实现的。这意味着你可以为每个流独立地控制数据传输的速率而不会影响到其他流。例如你可以限制一个流的数据传输速率而让另一个流以最大速率传输。
HTTP/2使用窗口更新机制来实现流量控制。每个流都有一个关联的窗口大小表示允许对方发送的数据量。当数据被接收并处理后接收方可以发送一个窗口更新帧来增加窗口大小从而允许发送方发送更多的数据。
总的来说HTTP/2的流量控制是基于每个流实现的从而允许更细粒度地控制数据传输而不仅仅是基于整个TCP连接。这为高效和灵活的数据传输提供了更多的可能性。 5 数据库
5.1 用过哪些数据库呢
答mysqlredises
5.2 mongo db用过没
没
5.3 myisam和innodb引擎的主要区别
MyISAM 和 InnoDB 是MySQL数据库中两种常见的存储引擎它们在设计、特性和适用场景上有很大的不同。以下是它们之间的主要区别 事务支持 InnoDB支持事务ACID兼容。它有提交、回滚和崩溃恢复能力。MyISAM不支持事务。 锁定机制 InnoDB使用行级锁定行锁这提供了更高的并发性特别是在高负载下。MyISAM使用表级锁定表锁。 数据完整性和外键 InnoDB支持外键和参照完整性这有助于确保数据库的完整性。MyISAM不支持外键和参照完整性。 存储结构 InnoDB存储其数据和索引在一个表空间中可以有多个文件或一个大文件取决于配置。MyISAM为每个表存储三个文件.frm, .MYD, .MYI。其中.frm为表定义文件.MYD为数据文件.MYI为索引文件。 崩溃恢复 InnoDB由于其事务日志特性InnoDB可以在崩溃后进行恢复。MyISAM可能需要更多的维护和修复工作特别是在崩溃后。 全文索引 InnoDB在MySQL 5.6及更高版本中支持全文索引。MyISAM支持全文搜索索引。 空间使用 InnoDB通常使用更多的磁盘空间因为它会为每个表存储数据和索引在同一个表空间中。MyISAM可能使用较少的磁盘空间因为它将数据和索引存储在不同的文件中。 备份 InnoDB可以使用热备份即在服务器运行时备份。MyISAM通常需要锁定表来进行备份。 使用场景 InnoDB由于其事务支持和行级锁定InnoDB更适合于需要高并发和数据完整性的应用。MyISAM由于其简单的存储机制和高效的读操作MyISAM可能更适合于只读或大量读取的应用。
总的来说选择哪种存储引擎取决于特定的应用需求。在许多现代应用中InnoDB由于其事务支持和数据完整性特性而成为首选。然而MyISAM在某些场景下如只读应用或全文搜索仍然可能是一个合适的选择。
5.4 说一下undo logredo log和bin log的区别和用途 6 kafka
6.1 kafka的零拷贝机制
答少了两次拷贝和2次系统调用4次内核转换
7 实习
7.1 对你来说最难的一个需求
答架构实例反向同步
8 大学社团经历
8.1 你觉得除了写代码的话哪些东西对维护一个团队是最重要的呢
答团队中的成员关系各个组员的身体监控发挥团队成员的长处 9 反问
9.1 还有几轮面试呢
答看安排
9.2 多久出结果
答一周面一次
9.3 base地可选嘛
答对珠海广州和武汉
9.4 你们团队主要是在哪儿
答主要是在广州这边武汉有一个小的分组