1. JVM工做原理: JVM是Java程序运行的平台,它就像一台虚拟出来的计算机同样,负责执行Java编译好的字节码文件。JVM具备很是严格的实现规范,大多数操做系统均可以安装JVM,为Java语言的跨平台性起到了关键的做用。web
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语句、数据库设计、业务逻辑、算法等)