区块链或后端方面面经

本文涵盖了区块链、后端开发等多个领域的核心知识点,包括线程栈的溢出处理、堆栈的区别、类加载过程、同步锁的对比、数据库索引的失效条件、不可变类的设计及其优点、数据库优化策略、并发编程概念如CountDownLatch,以及JVM调优、内存管理、数据库事务与并发控制等。此外,还涉及了数据库范式、排序算法、操作系统内核、代理模式、HTTP请求类型及其区别,以及JVM内存模型和垃圾回收等方面,是面试准备的全面指南。
摘要由CSDN通过智能技术生成

1.      线程栈:先是会自动扩展,到达最大值才会溢出,溢出之后程序会收到一个段错误(java表现为异常),调高堆栈容量可能会增加内存开销和启动时间

2.      堆和栈的区别:(总结,栈的一切由系统管理,所以堆有各种碎片问题)

•        管理方式:栈由编译器自动管理;堆由程序员控制,使用方便,但易产生内存泄露。

•        生长方向:栈向低地址扩展(即”向下生长”),是连续的内存区域;堆向高地址扩展(即”向上生长”),是不连续的内存区域。这是由于系统用链表来存储空闲内存地址,自然不连续,而链表从低地址向高地址遍历。

•        空间大小:栈顶地址和栈的最大容量由系统预先规定(通常默认2M或10M);堆的大小则受限于计算机系统中有效的虚拟内存,32位Linux系统中堆内存可达2.9G空间。

•        存储内容:栈用于函数调用等,堆的内容由程序员决定。

•        分配方式:栈可静态分配或动态分配。静态分配由编译器完成,如局部变量的分配。动态分配由alloca函数在栈上申请空间,用完后自动释放。堆只能动态分配且手工释放。

•        分配效率:栈由计算机底层提供支持:分配专门的寄存器存放栈地址,压栈出栈由专门的指令执行,因此效率较高。堆由函数库提供,机制复杂,效率比栈低得多。Windows系统中VirtualAlloc可直接在进程地址空间中分配一块内存,快速且灵活。

•        分配后系统响应:只要栈剩余空间大于所申请空间,系统将为程序提供内存,否则报告异常提示栈溢出。

•        碎片问题:栈不会存在碎片问题,因为栈是先进后出的队列,内存块弹出栈之前,在其上面的后进的栈内容已弹出。而频繁申请释放操作会造成堆内存空间的不连续,从而造成大量碎片,使程序效率降低。

2. linux中有几种栈:进程栈、线程栈、内核栈( 在执行系统调用陷入内核之后,这些内核代码所使用的栈并不是原先进程用户空间中的栈,而是一个单独内核空间的栈,这个称作进程内核栈)、中断栈

3.      类加载过程:加载、连接(验证、准备、解析)、初始化、使用、卸载

4.      什么时候需要类加载:new、反射、发现父类未初始化、主类、动态语言支持(注意,被动引用不触发初始化,如数组引用,通过子类引用父类)

5. synchronized和lock的区别

• synchronized:可以只对需要同步的使用与wait()/notify()/nitifyAll()一起使用时,比较方便

• lock:可控性更好,在并发量比较小的情况下,使用synchronized是个不错的选择,但是在并发量比较高的情况下,其性能下降很严重,此时ReentrantLock是个不错的方案。

6. synchronized锁:

• Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。

• Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”

11. java实现计数器:原子操作类、加锁

13. sql语句:

• select * from TableA left join TableB on TableA.id=TableB.id 左外连接

• select * from TableA right join TableB on TableA.id=TableB.id 右外连接

• select * from TableA full join TableB on TableA.id=TableB.id 全外连接

全连接:完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

• select * from TableA JOIN TableB on TableA.id=TableB.id 内连接

自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

• select * from TableA cross join TableB 交叉连接

交叉连接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

14.    目录树数据库表设计:用一个一级分类表,一个二级表,用父节点id表示。本质上是一个一对多的关系,可以借鉴下面这个表:

l ID 编号 int

l aDept_DeptID 部门代码 char

l aDept_DeptName 部门名称 char

15.    长连接怎么实现:

16.    什么时候选择innodb、myisam:前者支持更多功能,如行级锁,后者效率更高,节省存储

17. hashmap和hashtable的区别:能不能接受null,线程安全,快速失败迭代,扩容方式

18.    数据库索引什么时候会失效:

1、索引列有函数处理或隐式转换,不走索引
2、索引列倾斜,个别值查询时,走索引代价比走全表扫描高,所以不走索引
3、索引列没有限制 not null,索引不存储空值,如果不限制索引列是not null,oracle会认为索引列有可能存在空值,所以不会按照索引计算)

19. java如何实现不可变类:

•        所有成员都是 private final 的

•        不提供对成员的改变方法,例如:setXXXX

•        确保所有的方法不会被重载。手段有两种:使用final Class(强不可变类),或者将所有类方法加上final(弱不可变类)。

•   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值