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(弱不可变类)。
•