1.1、Java内存模型
1.1.1、程序执行过程(双亲委派)
调用自身的findLoadedClass()去内存中寻找这个类,然后通过AppClassLoader,如果找不到则会调用其父类加载器 即ExtClassLoader同样去内存中寻找,如果找不到则会再通过父类加载器即BootStrap来寻找,如果都没有找到则会一层一层返回,即BootStrap通过它自身定义的加载路径加载,如果加载不到则会通过ExtClassLoader根据自身定义的加载路径加载,如果加载不到则会通过AppClassLoader加载。如果都加载不到,会报出ClassNotFund异常。
1.1.2、java执行流程
.java 经过编译器 .class JVM中的类加载器加载各个类的字节码文件由JVM执行引擎执行。
1.1.3、jvm构成
Java栈、Java堆、方法区、程序计数器、本地方法栈
1.1.4、cms垃圾收集器 垃圾回收做了什么,和G1对比
- 初始标记(STW initial mark)
- 并发标记(Concurrent marking)
- 并发预清理(Concurrent precleaning)
- 重新标记(STW remark)
- 并发清理(Concurrent sweeping)
- 并发重置(Concurrent reset)
G1垃圾回收相比较CMS可能最主要的差别,是增加了 碎片整理 这一点,并且在回收的同时进行碎片整理,垃圾回收的效率更高一些
1.2、jvm调优
1.2.1、jvm的一些工具,如何检测内存泄露
jstack — 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到 当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。
jconsole – jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java 程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
jinfo – jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。
jmap – jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。
jdb – jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。
jstat – jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。
jps – jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
1.2.2、JVM怎么调优
对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数
1)检查堆大小设置是否合理
检查新生代老年代大小设置 1:3
新生代中eden与suvivor比例
垃圾回收器选择
检查堆中大对象、数量最多的对象、是否发生内存泄漏、堆是否够用、线程堆栈是否够用
2)并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
3)年轻代大小选择
响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
4)年老代大小选择
响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
并发垃圾收集信息
持久代并发收集次数
传统GC信息
花在年轻代和年老代回收上的时间比例
减少年轻代和年老代花费的时间,一般会提高应用的效率
吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩
1.3、Tomcat调优
maxThreads:该线程池可以容纳的最大线程数。默认值:200;(可以加大看具体情况,我是加到400)
minSpareThreads:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是 10。(我加到20)
1、启动NIO模式
2、执行器优化(线程池)
3、禁用AJP连接器
1.4、分布式高并发怎么处理
1) 数据层
a) 集群
b) 分表分库
c) 开启索引
d) 开启缓存
e) 表设计优化
f) Sql语句优化
g) 缓存服务器(提高查询效率,减轻数据库压力)
h) 搜索服务器(提高查询效率,减轻数据库压力)
2) 项目层
a) 采用面向服务分布式架构(分担服务器压力,提高并发能力)
b) 采用并发访问较高的详情系统采用静态页面
c) 使用页面缓存
d) 用ActiveMQ使得业务进一步进行解耦,提高业务处理能力
e) 使用分布式文件系统存储海量文件
3) 应用层
a) Nginx服务器来做负载均衡
b) Lvs做二层负载
1.5、Java多线程
1.5.1、Java自带四种线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个固定线程数的线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个固定个数的线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
1.6、Java设计模式
创建型
1. 工厂模式:由子类决定要创建的具体类是哪一个
2. 抽象工厂模式:允许客户创建对象的家族,而无需指定他们的具体类
3. 单例模式:确保有且只有一个对象被创建
4. 原型模式:对象clone, 深拷贝,浅拷贝
5. 建造者模式:隐藏具体的建造过程及细节
结构型
1. 适配器模式:封装对象,并提供不同的接口
2. 装饰者模式:给对象附加不同的责任或功能
3. 外观模式:简化一群类的接口
4. 组合模式:客户用一致的方式处理对象集合和单个对象
5. 桥接模式:抽象与实现分离以实现不同的
6. 代理模式:你的经纪人
7. 享元模式:共享技术,支持大量细粒度的对象
行为型
1. 策略模式:封装可以互换的行为,并使用委托来决定要使用哪一个。
2. 观察者模式:让对象能够在状态改变时被通知
3. 模板方法模式:由子类决定如何实现一个算法中的步骤
4. 命令模式:封装请求成为对象
5. 状态模式:封装了基于状态的行为,并使用委托在行为之间切换
6. 迭代器模式:在对象的集合之间游走,而不暴露集合的实现
7. 责任链模式:和链表有点像,每个责任者都保存了要设置的下一个处理对象的指针或引用
8. 中介者模式:联合国,处理各国纠纷
9. 解释器模式:编译器
10. 备忘录模式: 游戏存档
11. 访问者模式:最复杂的模式,适用于数据结构相对稳定的系统
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71386.html