感觉自己基础知识很多没记住,后续还是要加强java基础学习+多看看面经
1.自我介绍
2.介绍java虚拟机内存模型
(1)运行时数据区:线程隔离数据区(程序计数器,Java 虚拟机栈,本地方法栈) ;线程共享数据区(堆,方法区)
(2)执行引擎
(3)本地库接口
(4)本地方法库
3.垃圾回收机制(垃圾收集主要是针对堆和方法区进行,在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收)
JVM如何判断一个对象是否可被回收:以 GC Roots 为起始点进行搜索,可达的对象都是存活的,不可达的对象可被回收/从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的
Full GC的触发条件:老年代空间不足
Java是否会存在内存泄漏(内存泄漏指不再被使用的对象或者变量一直被占据在内存中):当长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收
4.start()和run()方法的区别:start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。
5.ThreadLocal 是什么?
线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value,各个线程的数据互不干扰。
6.什么是volatile (我把volatile和transient搞混了)
volatile(只可以用来修饰变量,不可以修饰方法以及类)是轻量级同步机制,与synchronized相比,开销更小一些,同时安全性也有所降低,在一些特定的场景下使用它可以在完成并发目标的基础上有一些性能上的优势.但是同时也会带来一些安全上的问题,且比较难以排查,使用时需要谨慎
使用范例:单例模式的双重检查方法
作用:(1)保证了不同线程对该变量操作的内存可见性(当一个线程修改了变量,其他使用此变量的线程可以立即知道这一修改)
用volatile修饰的变量,读取操作与普通变量相同.但是写入操作发生后会立即将其刷新回主存,并且使其他线程中对这一变量的缓存失效
(2)禁止了指令重排序
transient 关键字可以使一些属性不会被序列化
7.tcp三次握手
假设 A 为客户端,B 为服务器端。A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x;B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y;A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1;B 收到 A 的确认后,连接建立。
8.get和post比较
8.get和post比较
- GET在浏览器回退时是无害的,而POST会再次提交请求。*
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,而POST支持多种编码方式。*
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。*
- GET请求在URL中传送的参数是有长度限制的,而POST么有。*
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。*
- GET参数通过URL传递,POST放在Request body中。*
从数列中挑出一个元素,称为 “基准”;重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
平均时间复杂度为:O(nlogn)
10.最后是各种综合问题,比如在项目中自己最有成就感的事情之类。
全部评论
(4) 回帖