面经总结一百题,跟我一样菜的可以看看?
1. JVM有几个分区,都有什么功能?
堆:线程共享。Jvm启动时创建,主要存放的就是实例对象,几乎所有的实例对象都在这里分配。是垃圾回收器主要管理区域,GC堆,可以物理上不连续,逻辑上连续就行。
参数设置:
最大堆:-Xmx: -Xms
设置新生代老年代比值:–XX:NewRatio
Eden Survior:–XX:SurvivorRatio
Minor GG:年轻代 复制算法
Full GC:老年代 标记清除算法
/*****************************************/
当一个对象被判定为 "死亡" 的时候,GC 就有责任来回收掉这部分对象的内存空间。新生代是 GC 收集垃圾的频繁区域。
当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳
( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。
但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。
Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。
现实的生活中,老年代的人通常会比新生代的人 "早死"。堆内存中的老年代(Old)不同于这个,老年代里面的对象几乎个个都是在 Survivor 区域中熬过来的,它们是不会那么容易就 "死掉" 了的。因此,Full GC 发生的次数不会有 Minor GC 那么频繁,并且做一次 Full GC 要比进行一次 Minor GC 的时间更长。
另外,标记-清除算法收集垃圾的时候会产生许多的内存碎片 ( 即不连续的内存空间 ),此后需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次 GC 的收集动作。
/****************************************/
本地方法栈:为本地方法服务。
方法区:
方法区与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。相对而言,垃圾收集行为在这个区域是比较少出现的,这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载
运行时常量池:
运行时的常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等消息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时的常量池中。一般来说,除了保存Class文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中。
运行时常量池相对于Class文件常量池的另外一个重要特征就是具备动态性。Java语言并不要求常量一定只能在编译期产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中。这种特性被开发人员利用的比较多的是String的intern()方法
JVM栈: 线程私有,生命周期和线程相同,其描述的是java方法执行的内存模型。每个方法执行的时候都会创建一个栈帧,用于存储局部变量表,操作栈,方法出口,动态链接等信息。
局部变量表存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double)、对象引用(reference类型,它不等同于对象本身,根据不同的虚拟机的实现,它可能是一个指向对象的起始地址的引用指针,也可能是一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。
其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用一个。局部变量表所需的内存空间在编译期间分配完成
线程计数器:线程私有,当前线程执行的字节码行号指示器,字节码解释器工作时就是通过改变这个计数器的值选取需要执行的下一条字节码指令,分支,循环,异常处理等都依赖这个计数器来完成。如果线程正值执行的是一个java方法,这个计数器记录的是正在执行的的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器则为空(undefined)。此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
直接内存
直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。这就是我们本机的内存,他的大小我们很有可能会忽略,造成OutOfMemoryError异常。
2. Spring的核心功能是什么?SpringMvc调用流程?
3. 什么叫事务?平时怎么处理事务?
4. Ajax()有什么功能?
5. Final finally finalize区别?
6. String,StringBuiild StringBuffer区别?
7. 什么是线程?如何开启和结束?
8. 在不创建变量,如何实现两个int型变量换值?
9. 说几个Mysql存储引擎,各有什么区别?使用场景?优缺点?
10. 请说明while(true)与for(;;)两种执行效率那个更高,为什么?
11. 请说一下java访问修饰符?
12. 谈 Spring的事务管理?
13. Spring拦截器有那些方法?多个拦截器执行时方法调用顺序?
14. 谈线程池?ThreadPoolExecutor各个参数的意义。-
15. 数据库优化?
16. 塔谈tomcat服务器?
17. 讲下sql的left join、right join、inner join?
18. 三次握手四次握手?为什么是三次?为什么是四次?画图?
19. Sql注入了解吗?
20. 集合框架?
21. HashMap数据结构和实现原理?
22. 底层数组Entry实现原理 hashing put get?
23. HashMap HashTable ConcurrentHashMAp? 实现原理?
24. Volatile ThreadLocal?
25. 生产者消费者问题?
26. Java如何实现多态?
27. 谈谈java垃圾回收机制?
28. 网页登录模块功能 Session Cookie?
29. 如何设计一个大型网站?都需要考虑什么?
30. 乐观锁和悲观锁?区别?应用场景?CAS?分段锁?
31. 分库分表设计问题?
32. Mybatis缓存?为什么不用hibernate?
33. Mybatis的工作原理
34. Object类常用方法?toString clone notify wait hashcode equals finalize
35. Equals与hashcode?为什么两个一起重写?
36. 多线程间通信?
37. 线程状态图说明?
38. 多种单列模式?
39. Linux常用命令?
40. 100以内的随机数排序怎么做手写代码?
41. 怎么看慢查询日志?
42. 垂直拆分、水平拆分怎么做的第一系列?
43. 为什么数据库使用B+树?
44. 分布式缓存?
45. Redis与mem***区别?
46. B与b+树?
47. Tcp udp区别?
48. Tcp ip?
49. 八大排序算法 ?查找算法?
50. 接口和抽象类?
51. Servlet中的方法以及什么时候调用?
52. 如何设计内存溢出内存泄漏?
53. 如何调整堆栈大小?
54. 知道线程默认大小吗?
55. 类加载机制?
56. Jvm加载流程?
57. 事务隔离机制?
58. 递归优缺点?
59. Lock相对于synchronize有哪些优缺点?
60. Redis提供分布式服务的方案?服务端、客户端各是怎么实现的?
61. 服务器上线之后要关注什么指标?
62. 介绍jvm内存模型?怎么设置Eden,Survivor比例?新生代转换成老年代的时间?CMS垃圾回收机制?G1垃圾回收机制?CMS和G1区别?G1原理?
63. Volatile 禁止指令从排序怎么实现?happens-before?(五个原则)
64. Arp协议详细介绍下?
65. 数组中找出所有重复数字?空间复杂度为O(1),时间复杂度最小?
66. 树的镜像?
67. 一个二维数组只含0,1;将1围城的矩阵中所有的0的数字转换成1?
68. Redis数据结果?
69. 怎么实现lru结构?
70. 数据库索引?优化和缺点?
71. 项目中用户权限控制?
72. 聚集索引和非聚簇索引区别?
73. 求链表中点?
74. https与http?有没有用过其他安全传输手段?
75. Error和异常区别,碰到那些常见的错误和异常?
76. 遇到error如何处理?常见的error与异常?
77. Java与c++?
78. 在求高精度的场景java有没有解决方案?
79. Java四种引用?
80. Aop实现原理?IOC?
81. 解决hash冲突方法,优缺点?
82. 创建索引需要注意什么 ?
83. 公平锁 非公平锁?
84. 死锁条件?如何解决?
85. 如何知道查询是否使用索引?
86. 锁在操作系统层面是如何实现的?
87. Osi七层模型每一层做什么事情?
88. Java反射?
89. Java动态***?CGLIB?
90. Redis两种持久化方式?淘汰数据
91. 如何判断单项链表存在环?
92. 平衡二叉树概念?
93. 字符流与字节流?
94. Jdk和jre区别;说几个jdk工具类?
95. jsp的九大内置对象、四个作用域、六个动作?
96. Jsp和servlet区别?
97. 手写常用设计模式(单例)
98. 手写生产者消费者模式?
99. Servlet处理请求的流程?
100. Mysql联合索引什么情况下可以生效?
101. 查找算法、各种树、各种排序、各种时间复杂度?