innodb和myisam相同数据哪个大

innodb更大,它需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
innodb中单个表的大小只受限于操作系统的文件大小限制,一般为2G

内存泄漏的区域

1.程序计数器

是JVM中唯一一块不会产生OOM异常的区域

2.虚拟机栈

线程每个方法执行的时候会创建一个栈帧,用于存储方法的局部变量,方法出口等信息,方法结束就出栈。
当栈的深度固定,请求的深度超过JVM规定的最大栈深度,抛出StackOverFlow异常
栈帧太小导致装不下方法中的数据也会抛出StackOverFlow异常
当栈的深度可以动态扩展没有足够的内存:抛出OOM(Out Of Memory)
其中,HotSpot不支持动态扩展,所以栈只有SOF,没有OOM

3.本地方法栈

同上

4.堆

堆区主要用于分配对象,逻辑连续的,物理上不一定连续
不够内存去装对象会发生OOM

5.方法区

用于存放虚拟机加载的类信息,常量,静态变量,以及引用的类型常量

6.运行时常量池

属于方法区的一部分,用于存放常量,包括字符串常量,final类型常量,基本数据类型值,Class文件中描述的符号引用。因为属于方法区的一部分,所以也会出现OOM。

7.内存泄漏和内存溢出的区别

泄露指分配了的内存不能及时回收,溢出指没有足够的内存来分配

epoll和select都是同步IO还是异步IO?

1.并行和并发

并行指多个处理器或者多核处理器同时刻处理多个任务
并发指一个处理器一段时间内同时执行多个任务

2.阻塞和非阻塞

阻塞和非阻塞主要关注的是调用操作之后(例如IO),程序是等待操作返回还是先做其他的事,定期轮询操作结果

3.同步和异步

同步指调用了之后程序得到返回结果再执行下面的操作,异步是调用了就不管了,设置回调函数或者信号通知来获取结果

TCP为什么不能两次握手

TCP的传输是双向的,一个来回一个SYN+seq+ack+ACK,SYN和ACK表示建立连接之后的响应,但是服务器的ack和SYN可以合并在一起发送,所以是三次,如果是两次,那么服务器不能确定自己发的消息是否正确到达了客户端
另外,当使用两次握手,如果存在一个在网络中超时的连接请求,客户端会重发连接,然后服务端正常建立连接,这时超时那个连接到了服务器,服务器会在回复一个同意建立连接的请求,又建立一个新的连接,客户端因为没有发过新的连接请求,所以会忽略这个消息,这样,服务端建立了两个连接,只有第一个连接在和客户端传输数据,第二个链接就浪费了。

线程池的拒绝策略

当线程池的缓存队列已满并且线程数已经达到最大线程之后,就会执行拒绝策略,分为以下四种:
AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
DiscardPolicy:丢弃任务,但是不抛出异常。
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务
CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

创建线程池的方式

1.通过Executors:Executors.newFixedThreadPool(5);
2.通过:

  1. public ThreadPoolExecutor(int corePoolSize,
  2. int maximumPoolSize,
  3. long keepAliveTime,
  4. TimeUnit unit,
  5. BlockingQueue<Runnable> workQueue) {
  6. this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
  7. Executors.defaultThreadFactory(), defaultHandler);

BlockingQueue(阻塞队列)

字面意思为阻塞队列,就是说队列的访问可能造成阻塞,主要包括队满的添加和队空的获取
入队的方法主要有:
offer:向队列放元素,如果满了直接返回false
put:向队列放元素,如果满了就阻塞
出队的方法主要有:
take:元素出队,如果空,就阻塞
poll:元素出队,如果空就返回null,可以指定时间内poll出来

阻塞队列基本都是基于ReentrantLock实现的,就是要进行入队出队操作的时候,lock锁住操作步骤

常用的BlockingQueue:

1.ArrayBlockingQueue

基于数组,容量有限

2.DelayQueue

其中的元素必须实现java.util.concurrent.Delayed接口

  1. public interface Delayed extends Comparable<Delayed> {
  2. long getDelay(TimeUnit unit);
  3. }

返回值是元素出队前的保持时间,当<=0就说明已经到期需要被释放,当调用take()时,要等到<=0才能去到
可以用来执行定时任务

3.LinkedBlockingQueue

LinkedBlockingQueue阻塞队列大小的配置是可选的,如果我们初始化时指定一个大小,它就是有边界的,如果不指定,它就是无边界的。说是无边界,其实是采用了默认大小为Integer.MAX_VALUE的容量 。它的内部实现是一个链表。
和ArrayBlockingQueue一样,LinkedBlockingQueue 也是以先进先出的方式存储数据,最新插入的对象是尾部,最新移出的对象是头部。

4.PriorityBlockingQueue

以优先级从低到高take阻塞队列中的元素

5.SynchronousQueue

只容纳一个元素,存了需要被取出才能继续存。

创建对象四种方法

new
clone
newInstance()
反序列化

CMS的四个过程

初始标记
并发标记
重新标记
并发清楚

死锁条件

请求的资源互斥
请求保持
不释放
循环等待

Java线程生命周期和操作系统线程生命周期的对应关系

输入网址到展示的整个过程,结合SpringMvc来讲

(1)DNS解析:浏览器缓存,本地缓存,Host文件,路由器缓存,DNS服务器
(2)建立基于TCP的HTTP连接
(3)发送get或者post请求到服务端
(4)SpringMVC前端控制器DispatcherServlet接受请求,调用HandlerMapping
(5)handlerMaping返回由拦截器和处理器(handler/controller)组成的执行链 HandlerExecutionChain。
(6)dispatcherServlet根据返回的Handler寻找对应的HanlderAdapter,HanlderAdapter调用handle方法通过反射调用handler的具体方法,通常我们使用的handler就是controller,对应的handlerAdapter就是SimpleControllerHandlerAdapter,handle方法返回一个MOdelAndView方法,dispatcherServlet调用视图解析器返回具体的视图,返回给前端
(7)前端渲染返回的视图
数据库乐观锁使用

@Transactional标签失效情况

不是public ,方法相互调用,Exception被catch