网上看到一性能面试题,感觉不错,转过来,https://www.cnblogs.com/sunshine2016/p/8532986.html
1. JVM工作原理: JVM是Java程序运行的平台,它就像一台虚拟出来的计算机一样,负责执行Java编译好的字节码文件。JVM具有非常严格的实现规范,大多数操作系统都可以安装JVM,为Java语言的跨平台性起到了关键的作用。
2. JVM垃圾回收原理:垃圾回收器会全程侦测Java应用程序的运行情况。当发现有些对象成为垃圾时,垃圾回收器就会销毁这些对象,并释放这些对象所占用的内存空间。(NULL值赋给相关对象和对象超出作用范围,可认为是垃圾)
3. JVM堆栈构成:堆(Heap)主要用来存放对象的,栈(Stack)主要是用来执行程序的.JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。
4. JVM的内存管理:JVM中的内存管理主要是指JVM对于Heap的管理,这是因为Stack,PCRegister和NativeMethodStack都是和线程一样的生命周期,在线程结束时自然可以被再次使用
5. 内存泄露和内存溢出产生的原因和结果:
内存泄露(memory leak)是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。
内存溢出(out of memory)就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。
从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。memory leak会最终会导致out of memory!
内存溢出的原因以及解决方法:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小
解决办法:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
重点排查以下几点:
1.检查对数据库查询中,是否有一次获得全部数据的查询。建议使用分页执行查询。
2.检查代码中是否有死循环或递归调用。
3.检查是否有大循环重复产生新对象实体。
4. 检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况
6. Java开发中会遇到的性能问题:
A. OOM内存不足:1. 不断地申请对象,后面对象申请不到内存资源(调整对象大小或扩容);2. 持续地启线程,申请栈资源,造成内存不足(调整每个线程的堆栈大小Xss=256或者扩容)3. 频繁地触发FULL GC,造成OOM(调整新生代GC大小或降低GC的执行次数)
B. 内存泄露:对象和线程等一直不释放资源,导致内存泄露(释放不必要的引用、使用对象缓存池、采用合理的缓存失效算法、合理使用SoftReference和WeekReference:SoftReference的对象会在内存不够用的时候回收,WeekReference的对象会在Full GC的时候回收)
C. 线程死锁:两个线程占用不同的资源不释放,造成线程死锁(规定资源执行顺序,但是也会造成锁饥饿,解决办法是减短锁释放时间)
D. 锁争用:很多线程竞争互斥资源,但资源有限, 造成其他线程都处于等待状态(使用非阻塞队列算法、拆分锁,去除读写操作的互斥,尽可能少用锁)
E. 堆栈资源不足:线程嵌套式地申请堆栈资源,导致堆栈资源不足(调整堆栈大小)
F. Java进程消耗CPU过高:1. us高:执行线程不需要任何挂起动作,且一直执行,导致CPU 没有机会去调度执行其他的线程。(增加Thread.sleep,以释放CPU 的执行权,降低CPU 的消耗);2. sy高:线程的运行状态要经常切换(降低线程数)
G. 文件IO消耗严重:多个线程在写进行大量的数据到同一文件,导致文件很快变得很大,从而写入速度越来越慢,并造成各线程激烈争抢文件锁。(异步写文件、批量读写、限流、限制文件大小)
H. 网络IO消耗严重: 同时需要发送或接收的包太多。(限流,限流通常是限制发送packet的频率,从而在网络IO消耗可接受的情况下来发送packget。)
6. 性能瓶颈分析:
查找瓶颈时按以下顺序,由易到难:服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库,web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)