美文网首页
java程序的优化

java程序的优化

作者: 悟空嘿 | 来源:发表于2019-03-17 19:26 被阅读0次

        最近一直在准备面试的东西。各种分布式锁,事务,缓存,MQ,ES,JVM,tomcat之类的,如何使用是其一,原理其二,如何调优时其三。

        知识点复习的大致可以了,除了算法和数据结构这方面没有下功夫钻研。对于调优,我总结下来就两方面。第一,为了让系统更稳定;第二,让系统性能得到提升。

        稳定性常见手段是负载集群,主从等。但是单个节点更具体的优化大致总结如下:

        第一点,让系统更加稳定,是最重要的。当然,在第一点的基础上,第二点才有意义。关于系统稳定性,从各个方面,都能展开讨论。首先,作为java程序员,jvm的调优如何做,应该比较清楚。从jvm的结构下手,区分开了java堆,java栈,本地方法栈,方法区,PC寄存器。主要优化的点,就缩小到了堆内存。堆,有被划分了成了几个代,每个代的特点,然后就是垃圾回收。jvm为什么会不稳定,就是因为垃圾回收时会需要很长的STW时间,造成了系统暂停过长,导致的不稳定。但是,垃圾回收时必要的,不然,系统内存溢出直接宕机。垃圾回收的几种垃圾收集器,这是垃圾回收的工具,优化就是从这几个工具的特点来入手的。

        分代:年轻代,老年代,永久代。年轻带有分为了Eden(新生代)和Survive(幸存区)。Survive,又被分为了From和To两个区域。这些划分出来的概念要清楚,配合垃圾收集器,在不同的代,用不同的垃圾收集器。

        比如年轻代,用并发收集器,快速高效,但会多使用一点CUP,在老年代用CMS收集,为了减少到老年代的垃圾回收(因为会STW,造成jvm短暂不可用),可以为老年代适当增加一点内存,设置为机器稳定运行占用内存的2倍大小,禁止System.gc()。主要jvm参数 需要具体研究,各种触发条件的阈值,并行线程数量等设置。 切换G1收集器,因为G1收集器采用不同内存划分,收集时间更加可控。 另外将老年代中的大对象,放入缓存,会减轻老年代的负担,从而减少full GC;

JVM性能调优(具体优化参考)

        tomcat的优化,一方面是JVM的优化,另外的是线程池,http连接协议(bio,nio,apr)等。

 Tomcat优化  (具体优化参考)

        应用系统优化。稳定性主要还是防雪崩,做到隔离,比如hystrix,Sentinel (阿里开源组件),做到系统不会因为某个服务的故障,导致资源被耗尽,系统整体故障。

        缓存的优化,防止被击穿,故障雪崩。防雪崩:本地 ehcache 缓存 + hystrix 限流&降级,避免 数据库 被打死。事后恢复,从redis持久化数据中加载恢复缓存数据。击穿问题呢,要对资源加锁,同一时间,只能访问一次,其他线程等待,先访问缓存,再访问数据服务,防止被击穿。

        MQ也是一样的,首先想到的是jvm优化,g1替代cms,初始化内存;线程数量设置;文件存储策略,志保留策略配置;

kafka性能调优

        ES优化,也可以优先jvm调优。剩下的就跟数据库调优类似了,因为ES更像一个数据库。大的索引拆分,线程池优化等

亿级规模的Elasticsearch优化实战

        因为技术手段各式各样,我们不能每遇到一个技术,就去死记硬背一些知识点,这样既容易忘,也容易混乱。把握住几个方向点,在遇到新的技术的时,将这些点在新的技术上具体分析一下,很快就能掌握其核心原理和优化方法。道和术都很重要,掌握了道的真意,再去学术,会更得心应手。

        性能提升的优化,更多依赖于数据结构和算法的优化,所以,数据结构和算法也是工程师的必修课。

相关文章

网友评论

      本文标题:java程序的优化

      本文链接:https://www.haomeiwen.com/subject/jknumqtx.html