面试复习2,面试复习
面试复习2,面试复习
基础问题
Java 基本数据类型基础面试题
Java 包装类型装箱拆箱基础面试题
Java 字符串相关面试题
Java 重载与重写面试基础题
Java final、static 关键字基础面试题
Java 异常相关面试题
Java clone 相关面试题
Java 序列化
问:什么是OOA、OOD、OOP
OOA(Object-Oriented Analysis):面向对象分析法(按照面向对象的思想来分析问题)
OOD(Object-Oriented Design):面向对象设计(根据需求决定所需要的类、类的操作以及类之间关联的过程)
OOP(Object-Oriented Programming):面向对象程序设计(是一种计算机编程架构)
问:接口和抽象类的区别
集合问题:
Java 集合 ArrayList
Java 集合 LinkedList
问:linkedList可以用for循环遍历吗?
不可以,数据量大的时候会很慢,因为每遍历一个元素的时候都会把前面的数据都走一遍。
问:HashMap和Hashtable的区别
最主要的区别的hashMap不是线程安全,而hashtable是线程安全的,一般项目中我们用hashmap比较多,因为它性能比hashtable好,hashtable里面的方法是用synchronized关键字保证安全的,如果hashtable想要保证线程安全,可以用Colloctions.synchronized()方法或者直接用concurrentHashmap。还有就是hashtable的key不能为null,hashmap的key可以为null,hashmap继承AbstractMap,初始容量16,而hashtable继承Dictionary,初始容量11。
java三大集合框架
问:HashMap 的底层数组长度为何总是2的n次方?
参考:减少碰撞,分布均匀,空间利用率高。
问:讲讲hashmap? 看1.7点击这里
答:hashmap的底层实现是数组+链表,hashmap存储数据的时候是以key-value形式存储的,它有三个很重要的参数,容量、扩容因子,扩容阈值。工作共常用的是get和put两个方法。当我们调用put方法时:判断key是否为null,若为null,则直接调用putForNullKey方法;若不为空,则先调用key的hashcode方法计算hash值和indexFor找到数组位置,如果数组在该位置处有元素,则查找是否存在相同的key,若存在则覆盖原来key的value,否则将该元素保存在链头(最先保存的元素放在链尾)。此外,若数组在该处没有元素,则直接保存。当我们调用get方法时,判断key是否为null,如果key是null,table[0]这个位置的元素将被返回。则先调用key的hashcode方法计算hash值和调用indexFor方法找到数组存储的位置,再迭代链表,调用equal方法比较key值,如果相等,则返回value值。hash还有一个比较重要的方式是扩容,即resize()方法。随便数据越来越多,发生碰撞的概率越来越大,链接的长度也会越来越长,就会影响hashmap的存取速度,当达到某个阈值的时候(threshold=table数组长度*加载因子),就会发生扩容现象,会创建一个2倍长度的数组,再调用transfer()方法把原来数组的元素重哈希到新数组。
1.7和1.8有什么区别:
对象:首先1.7数组里面存的是entry对象,1.8存的是node对象。
结构:1.7的底层结构是数组+链表,1.8底层结构是数组+链接+红黑树(treeNode,链表长度>8时,存放到红黑树,链表长度<8时,存放到单链表),1.7链表插入是头插法,1.8链表插入是尾插法。
扩容:1.7扩容按原来方法进项计算,1.8按扩容后的规律计算(扩容的位置=原位置or原位置+旧容量)
最后hashmap不是线程安全的。
问:为啥不是线程安全的,举几个例子?
答:在扩容resize()过程中,在将旧数组上的数据 转移到 新数组上时,转移数据操作 = 按旧链表的正序遍历链表、在新链表的头部依次插入,即在转移数据、扩容后,容易出现链表逆序的情况 ,即扩容前 = 1->2->3,扩容后 = 3->2->1,此时若(多线程)并发执行 put()操作,一旦出现扩容情况,则 容易出现 环形链表,从而在获取数据、遍历链表时 形成死循环(Infinite Loop),即 死锁的状态。
假设线程一执行到这 失去了运行权限,线程二执行完成了。于是就有了右图的样子。因为Thread1的 e 指向了key(3),而next指向了key(7),其在线程二rehash后,指向了线程二重组后的链表。我们可以看到链表的顺序被反转后,但是指向没变。线程一调用就会回来执行。
问:介绍一下ConCurrenthashmap
答:我感觉是因为一面问了hashmap,所以二面面试官可能是看见了面试记录,额,这块我非常熟,这个我又讲了很长时间,讲了ConCurrentHashMap的底层的分段锁的结构,讲了ConCurrentHashmap的get源码,get源码是没有使用锁的,这里我把get源码背写了下来,并给面试官讲了get源码在插入修改删除的多线程下是安全的;然后讲了put操作,remove,扩容操作,然后讲了在1.7和1.8的区别,引入了红黑树,链表长度大于8转换成红黑树,采用了CAS+synchronized来保证并发安全.
多线程:
ArrayBlockingQueue和LinkedBlockingQueue
Springboot:
问:springboot自动配置的原理
1)SpringBoot启动会加载大量的自动配置类
2)我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
3)我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这
些属性的值
SpringCloud:
Spring Cloud底层原理
问:zuul服务网关的作用:
所有请求都往网关走,网关会根据请求中的一些特征,将请求转发给后端的各个服务。可以做统一的降级、限流、认证授权、安全,等等。
问:调用方法
-
首先Ribbon会从 Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号。
-
然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器
-
基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
问:springCloud断路器的作用:
当一个服务调用另外一个服务的时候,由于网络原因或者自身原因出现问题时,调用者就会等待被调用者的相应,当更多的服务请求到这些资源时,导致更多的请求等待,这样就会发生雪崩效应,断路器就可以解决这个问题。断路器有两种状态:完全打开:在一定时间当,当请求失败次数达到一定阈值的时候,断路器就会完全打开,后面的请求就会执行降级逻辑(有时间,默认5秒)。半开:每隔一段时间(默认5秒)会将尝试转发一个请求给被调用者服务器,能正常调用以后,断路器关闭。
Dubbo:
SpringCloud和Dubbo区别:
1、SpringCloud起步比较晚,Dubbo中文文档比较完善。
2、社区活跃度上来说,SpringCloud更新频率快
3、SpringCloud框架比较完整,Dubbo只是实现了服务治理,Spring Cloud有很多个子项目覆盖了微服务框架下面的分分面面。
4、Dubbo实现了服务治理的基础,但是要完成一个完备的微服务架构,还需要在各环节去扩展和完善以保证集群的健康,以减轻开发、测试以及运维各个环节上增加出来的压力,这样才能让各环节人员真正的专注于业务逻辑。而Spring Cloud依然发扬了Spring Source整合一切的作风,以标准化的姿态将一些微服务架构的成熟产品与框架揉为一体,并继承了Spring Boot简单配置、快速开发、轻松部署的特点,让原本复杂的架构工作变得相对容易上手一些。
分布式:
分布式锁:
3种分布式锁
Redis分布式锁要这样实现才牛逼
分布式远程调用:
分布式缓存
Redis:
缓存穿透,缓存击穿,缓存雪崩解决方案分析
redis面试题
数据库与缓存双写情况下导致数据不一致问题
MongoDB:
问:MongoDb使用场景
网站数据:非常适合实时的插入、更新和查询,并具备高度的伸缩性。还有存一些大尺度、低价值的数据。用于对象及JSON数据的存储。mongodb数据库非常适合文档式的存储和查询。
优点:
性能优越,在适量级的内容的mongodb性能是很快的,它将热点数据放到内存里。
高扩展,支持分片。
文档结构的存储方式,能够更加便捷获取数据
支持map-reduce框架
缺点:
占用空间大,事务支持很弱
问:MongoDb和mysql的区别
MQ:
Kafka:
问:什么是kafka?
是一个发布订阅的消息系统,是一个分布式、分区和重复的日志服务。
问:什么是传统的消息传递方法?
点对点(排队):在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人。
发布-订阅:消息广播给所有订阅的用户。
问:Kafka相对传统技术有什么优势
1、快速:单一的Kafka代理可以处理成千上万的客户端,每秒处理数兆字节的读写操作。
2、可伸缩:在一组机器上对数据进行分区和简化,以支持更大的数据
3、持久:消息是持久性的,并在集群中进行复制,以防止数据丢失。
4、设计:它提供了容错保证和持久性
问:解释Kafka的Zookeeper是什么?我们可以在没有Zookeeper的情况下使用Kafka吗?
Zookeeper是一个开放源码的、高性能的协调服务,它用于Kafka的分布式应用。
不,不可能越过Zookeeper,直接联系Kafka broker。一旦Zookeeper停止工作,它就不能服务客户端请求。
-
Zookeeper主要用于在集群中不同节点之间进行通信
-
在Kafka中,它被用于提交偏移量,因此如果节点在任何情况下都失败了,它都可以从之前提交的偏移量中获取
-
除此之外,它还执行其他活动,如: leader检测、分布式同步、配置管理、识别新节点何时离开或连接、集群、节点实时状态等等。
MYSQL:
MySQL企业常用集群图解
mysql数据库引擎
B+Tree索引原理
问:MySQL的索引(好文)
问:项目中一般是怎么建立索引的(注意实现):
mysql索引使用技巧及注意事项
问:主键和索引的区别
1、主键和索引都是健,而且主键一个特殊的索引,主键是逻辑健,它不实际存在于数据库中的,而索引是物理健,实际存在数据库中。
2、一个表只能由一个主键,而可以由很多个索引。
3、主键是数据的唯一标识,避免数据出现重复情况。而索引是用来提高查询速度的。
问:怎么定位SQL问题和优化
分析定位问题方法:
1、拿到一个数据库以后,先show global status命令看下整个数据库各种SQL的执行频率。
2、定位执行慢的SQL,这里由两种方法,一个是打开mysql的慢查询日志,另外一个种是用show procsslist;命令查看当前mysql在进行的线程情况(state列是连接状态比较重要)。
3、拿到慢查询SQL后,用explain命令分析执行计划。(主要是看type、key、Extra这几列)
4、通过show profile分析慢查询SQL的执行效率(看下哪一步比较耗时)
通过上面几个步骤后,该加索引就加索引,该调整语句结构就调整,该杀进程就杀进程。
问:数据库,4大特性
答:原子性,我说就是一个事务要么全部完成,要么全部失败,要么做要么不做;一致性,比如a+b=100,一个事务改变了a比如增加了a的值,那么必须同时改变b,保证在事务结束以后a+b=100依然成立,这就是一致性;持久性,额就是修改完以后,在数据库中生效是永久的;隔离性,我就是说对于A对B进行转账,A没把这个交易完成的时候,B是不知道A要给他转钱。
问:数据库,4大隔离级别
答:额,(怎么都要举例子啊,啊啊啊啊~),内心波澜,脸上面无表情地说:1.未提交读,事务中发生了修改,即使没有提交,其它事务也是可见的,举例子我就说对于一个数A原来50修改为100,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是50,但是另一个事务看到的A是100,这就是未提交读;2.提交读,就是说,对于一个事务从开始直到提交之前,所做的任何修改是其它事务不可见的,举例就是对于一个数A原来是50,然后提交修改成100,这个时候另一个事务在A提交修改之前,读取到了A是50,刚读取完,A就被修改成100了,这个时候另一个事务再进行读取发现A就突然变成100了;3.可重复读;可重复读,就是对于一个记录读取多次的记录是相同的,举例就是对于一个数A读取的话一直是A,前后两次读取到的A是一致的;可串行化读,就是说在并发情况下,和串行化的读取的结果是一致的,没有什么不同,这个举例我就说,不会发生脏读和幻读;然后数据库这一块就过去了。
问:集群脑裂
集群的脑裂通常是发生在集群中部分节点之间不可达而引起的(或者因为节点请求压力较大,导致其他节点与该节点的心跳检测不可用)。当上述情况发生时,不同分裂的小集群会自主的选择出master节点,造成原本的集群会同时存在多个master节点。
Mybatis:
问:mybatis和hibernate区别和用途
1、mybatis是半自动的,hibernate是全自动的。
2、hibernate数据库的移植性比mybatis数据库要好。
3、hibernate拥有完整的日志系统,mybatis则欠缺一些。
4、sql优化上,mybatis方便灵活更多。
5、hibernate配置比mybatis多,学习成本会更高。
Nginx:
Nginx 学习 —— 负载均衡
Http:
问:session和cookies区别:https://blog.csdn.net/qq_26857649/article/details/84861526
问:http和https区别
问:https原理
问:网络7层协议
应用层 - 表示层 - 会话层 - 传输层 - 网络层 - 数据链路层 - 物理层
问:TCP在哪层,UDP在哪层,HTTP在哪层?
IP: 网络层
TCP/UDP: 传输层
HTTP、RTSP、FTP: 应用层
线程池:
https://blog.csdn.net/qq_26857649/article/details/83097832
问:线程池有哪几种:
1、newCachedThreadPool():创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2、newFixedThreadPool(): 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3、newScheduledThreadPool(): 创建一个定长线程池,支持定时及周期性任务执行。
4、SingleThreadExecutor():单线程池子,任意时间只能有一个线程。
问:线程池执行过程:
1、如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
2、如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该 任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任 务;
3、如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
4、如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。
问:线程池拒绝策略有哪几种:
一共有4种:1、丢弃任务并且抛出异常。2、丢弃任务但是不抛出异常。3、丢弃队列最前面的任务重新执行任务。4、用调用线程去处理该任务。
问:缓存队列策略:
ArrayBlockingQueue(基于数组)和LinkedBlockingQueue(基于链表)先进先出队列。
问:队列长度应该怎么设置:
一般情况下:队列大小=客户端超时 * 每秒处理的交易数
JVM性能分析和调优手段:
设计模式:
问:分布式环境下怎么创建单例模式:
可以利用分布式锁啊,数据库啊 ,redis都可以,先判空,空的情况下就去抢锁,抢到了再此判空,空就去生成单例。
https://blog.csdn.net/qq_26857649/article/category/8265196
工作遇过什么困难,怎么解决的:
IO:
Spring:
问:谈下你对spring的理解
spring是一个轻量级的容器,说spring轻量级是从它的大小和开销来说的,完整的spring框架可以在一个大小只有1MB的JAR文件里发布。而且spring对代码是非侵入的。spring提供了容器功能,容器可以管理对象的生命周期,还有对象和对象之间的关系。最后它有两个核心概念,依赖注入(DI)也叫控制反转(IOC)和AOP(面向切面编程)。
问:什么是依赖注入控制反转(IOC)
spring的ioc是指对象的控制器由调用者移交给容器,使得调用者无需关系对象得创建和管理,可以专注于业务逻辑开发,还可以解耦对象之间的依赖关系,避免通过硬编码的方法耦合在一起。
问:常用注入方式有哪些
setter注入、构造方法注入、基于注解注入
问:什么是面向切面编程(AOP)
spring的aop是专门处理系统中各模块中的交叉关注的问题,将具有横切性质的系统业务提取到切面中,与核心业务逻辑分离。(例如:日志,权限,事务)
问:AOP的实现原理
aop的实现原理是动态代理,主要由两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过类的反射来接受被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心就是IvocationHandler接口和Proxy类。如果目标类没有实现接口,那么springaop会选择使用CGLIB来动态代理目标类,CGLIB是一个代码生成的类库,可以在运行的时候动态生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代码,如果目标类用final修饰了,那么就无法用CGLIB做动态代理。
问:SpringBean的作用域之间有什么区别:
singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由 bean factory自身来维护。
prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。
request:在请求bean范围内会为每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收。
session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。
问:拦截器和过滤器的区别
问:spring是怎么使用事务的
SpringMVC:
问:简单的谈一下SpringMVC的工作流程?
1、用户发送请求到前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理映射器
3、处理映射器找到具体的处理器,生成处理器及处理器拦截器(如果有则生成)一并返回到DispatcherServlet
4、DispatcherServlet调用HandlerAdapter处理适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6、Controller执行完成后返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、Dispatcher将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
算法:
问:二分查找
问:插入排序
问:冒泡排序
问:二叉树了解吗,写一个二叉树的深度搜索遍历?
JVM:
问:JVM的体系结构
类装载器(ClassLoader)(用来装载.class文件)
执行引擎(执行字节码,或者执行本地方法)
运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)
问:让我说说JVM的分为哪几块?
答:JVM分为方法区(加载得类信息,类的静态变量,final常量)、堆(存储对象以及数组)、程序计数器(存储线程指令)、虚拟机栈(方法执行的内存模型)、本地方法栈。其中虚拟机栈、本地方法栈和程序计数器是线程私有的,堆和方法区是线程共享的。除了程序计数器不会发生内存溢出,其它都会发生内存溢出。溢出也有分堆溢出(OutOfMemoryError)和栈溢出(StackOverflowError)。
栈溢出:因为栈是线程私有的,栈溢出就是方法的执行创建的栈帧超过了栈的深度。最有可能的就是方法递归导致这种结果了。我们可以使用参数 -Xss 去调整JVM栈的大小。
堆溢出:堆中主要存的是对象,不断new对象导致发生堆溢出。可以通过 -Xmx调整堆的总大小。
问:内存溢出和内存泄漏的区别?
答:内存泄露我说就是一块申请了一块内存以后,无法去释放掉这块内存,丢失了这段内存的引用;内存溢出就是申请的内存不够,撑不起我们需要的内存;内存泄露最终会导致内存溢出。
内存泄露原因和内存泄露解决方案:点击
内存溢出的原因有很多:1、加载数据量过大,如一次性从数据库取出过多的数据;2、集合类中有对对象的引用,使用完后未清空,使得jvm不得回收;3、代码中存在死循环或循环产生过多重复的对象实体;5、启动参数内存值设置过小。
内存溢出的解决方案:1、修改启动参数,直接增加内存(-Xms,-Xmx参数一定不要忘记加);2、检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。3、对代码进行分析(一、分析查询语句,测试环境和生产数据量不一样。二、检查有无死循环或者递归。三、检查是否有大循环重复产生新对象实体)。;4、用内存查看工具分析。
问:类加载器的过程你了解吗?
加载 ,验证,准备,解析,初始化
问:双亲委派机制你了解吗?
当application classloader接受到一个类请求时,它首先不会自己去加载这个类,它会委派到父类extension classloader去完成,当extension classloader接受到一个类请求时,它首页也不会自己去加载这个类,它会委派到父类bootstrap classloader去完成,如果bootstrap classloader加载失败,就会让extension classloader去加载,如果extension classloader也加载失败,就会让application classloader去加载,如果都加载失败就会抛出classnotFoundException。
优点:1、保存运行安全性,防止不可信类扮演可信类 2、层级关系保证了各种环境的加载顺序。
问:介绍一些虚拟机的内存模型?
答:这个之前也准备过,这里要注意了,虚拟机的内存模型和运行时的数据区域不是一回事;虚拟机内存模型又叫JMM,就是每个线程有自己的工作内存,然后又一个主内存,线程工作的时候都是在自己的工作内存中拷贝一个主内存的副本;还说了JMM的happens before原则,程序顺序原则,锁原则,线程中断原则,传递性原则
问:介绍一些你了解的垃圾回收算法?
答:标记清除,标记整理,复制算法,把每个算法是啥说了一遍;
问:知道SurvivorRatio这个参数为啥初始是默认的8:1:1吗?
问:垃圾会收器中,标记清除多次后,由于采用的是标记清除算法,那么你觉得可能会出现什么问题?
答:然后我说由于产生了内存碎片,所以当分配一个大对象的时候,由于内存不连续,那么会产生full GC;
问:这里提及到了full gc,问我,哪些情况会产生full GC,哪些情况产生minor GC?
答:minor会产生在eden区满了,fullGC产生在老年代的剩余空间不足,以及永久代内存不足也会发生fullGC。
问:除了你项目中的内存溢出问题,你还知道哪些关于内存溢出内存泄漏的?
答:这里之前了解过ThreadLocal,我说,ThreadLocal中的键值对中的键是一个弱引用,那么在内存回收的时候,这个键很可能会被回收掉,然后键没了,就无法找到value的值,造成了内存泄漏;
Tomcat:
Tomcat系统架构
问:解释什么是Jasper?
Jasper是Tomcat的JSP引擎,它解析JSP文件,将它们编译成JAVA代码作为servlet,在运行时,Jasper允许自动检测JSP文件的更改并重新编译它们。
问:解释servlet如何完成生命周期?
1、Tomcat通过它的其中一个连接器接收来自客户端的请求。2、进程请求Tomcat将此请求映射为适当的。3、一旦请求被定向到适当的servlet,Tomcat就会验证servlet类是否已经加载。如果不是Tomcat将servlet包装成Java字节码,这是由JVM执行的,并形成servlet的实例。4、Tomcat通过调用它的init来启动servlet,它包含能够筛选Tomcat配置文件并相应地采取行动的代码,并声明它可能需要的任何资源。5、一旦servlet启动,Tomcat就可以调用servlet的服务方法来进行请求。6、在servlet的生命周期中,Tomcat和servlet可以通过使用侦听器类来进行协调或通信,从而跟踪各种状态变化的servlet。7、删除servlet,Tomcat调用servlet销毁方法。
问:Tomcat默认缺省端口?
默认8080,修改在conf目录下server.xml里面的Connector
问:Tomcat有几种Connector?
bio:传统Java的I/O操作,同步且阻塞IO。
nio:JKD1.4开始支持,同步阻塞或非同步阻塞IO。
aio:JKD1.7开始支持,异步非阻塞IO。
apr:Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。
问:Tomcat有几种部署方式?
1、直接把web项目在webapps下,Tomcat会自动将其部署。
2、在server.xml文件上配置<Context>节点,设置相关属性即可。
3、通过Catalina来进行配置:进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字。编写xml的方式来进行设置。
问:Tomcat容器是如何创建servlet实例?用到什么原理?
当容器启动的时候,会读取webapps目录下所有的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。(有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
问:Tomcat如何优化:https://blog.csdn.net/qq_26857649/article/details/84866199
问:内存调优
内存方式的设置是在catalina.sh中,调整一下JAVA_OPTS变量即可,因为后面的启动参数会把JAVA_OPTS作为JVM的启动参数来处理。
具体设置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4"
其各项参数如下:
-Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m:设置持久代大小为16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
其它:
大数据:
参考:https://blog.csdn.net/qq_26857649/article/details/84729945
Linux:
问:如何查看端口占用情况
1、lsof -i:端口号
2、netstat -tunlp|grep 端口号
问:如何查看内存情况
1、top:top命令可以实时查看系统的内存使用情况,有多少物理内存已经使用的,多少物理内存空闲,多少缓存,CPU的使用情况,每个进程的进程号是多少,占用的虚拟内存是多少等信息。
PID:当前运行的ID
USER:进程属主
PR:每个进程的优先级别
NI:反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程“优先级”越高,而值越大“优先级”越低。一般会把ni值叫做静态优先级。
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数。
%CPU:进程占用CPU的使用率
%MEM:进程使用物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU的时间,即占用CPU使用时间的累加值
COMMAND:进程启动命令名称
2、free:free命令是一个快速查看内存使用情况的方法,是对/proc/meminfo 收集到的信息的一个概述。
total:总计物理内存的大小
used:已使用多大
free:可用有多少
shared:多个进程共享的内存总额
buffers/cached:磁盘缓存的大小
3.cat /proc/meminfo
查看RAM使用情况最简单的方法是通过命令:cat /proc/meminfo; 个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。
问:如何查看文件或者目录占用磁盘的大小
du命令用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh
-h:以人类可读的方式显示
-a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
-s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
-c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
相关文章
- 暂无相关文章
用户点评