欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

系统优化怎么做-JVM优化之开篇

程序员文章站 2022-05-04 15:18:05
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/youhua 思否专栏:https://segmentfault.com/blog/youhua 全网私 ......

大家好,这里是「聊聊系统优化 」,并在下列地址同步更新

  • 博客园:
  • 知乎专栏: 
  • 思否专栏:
  • 全网私活,免费订阅: 

在这里我会从基于j2ee系统及互联网架构方面,来谈谈系统优化的各个方面,干货满满,欢迎订阅及关注!

前言

在上一期tomcat优化中,针对jvm相关主要参数做过一定说明,这一期主要介绍进行一些概念及经验。后面分章节去讲述相关工具的基本使用。

优化优先级

整体来讲,系统优化应先优化架构及代码,来解决具体功能点效率问题。最后通过jvm监控工具来发现一些隐藏较为深入的问题。

相关情形

  • 内存占用并不断增加, 系统压力大情况下full gc频繁,系统出现卡顿
  • 线程出现大量等待及死锁, cpu使用率过高, 系统响应慢
  • 堆(heap)内存不足或类加载导致jvm crash,系统宕机
出现以上情况,就得使用工具分析jvm来确定问题

jvm内存模型

系统优化怎么做-JVM优化之开篇

jdk1.7及以下

jdk1.8下,permgen替换成vm metaspace

heap域

  • 全局被所有线程分享
  • 存所有对象及集合对象

方法域

  • 全局被所有线程分享
  • 存所有类的结构定义包含属性,方法及构造函数等

thread1.n

  • 本地私有栈,一个线程一个栈
  • 保持着所有在heap域的对象引用(4byte长度)
  • 存储本地局部变量的存储(基础数据类型),程序运行状态,方法返回值

内存泄漏的分类

  • 堆内存泄漏 - 比较常见
  • 持久代内存泄漏
  • 栈内存泄漏
  • 系统资源内存泄漏 -比较常见

线程相关知识

jvm线程状态迁移

系统优化怎么做-JVM优化之开篇

线程状态

  • 初始化(new):初期创建,启动后则进入可执行状态
  • 可执行状态(runnable): 只要获取cpu时间,则开始执行
  • 运行状态(running): 正在使用cpu执行
  • 阻塞状态(bloked)

    • 等待阻塞(wait)
    • 同步阻塞(synchronized)
    • 睡眠阻塞(sleep)
    • join阻塞: 等待join子线程结束后,主线程才能执行,将异步执行的线程合并为同步的线程
  • 结束状态: 线程执行完毕或者异常退出

性能监控关注点

  • 系统线程总数
  • 死锁线程 需要优先解决
  • 线程bloked总数数量

    线程bloked多的情况下,考虑对待处理数据进行分片,进行多通道,多线程处理提高系统性能
    如果系统处理慢,但cpu占用一直很低,就需要梳理系统处理流程,串行处理该并行处理,并行处理流程提高并发来解决。

线程死锁

当两个或者多个线程尝试获取其他资源的锁,而每个线程又陷入无限等待其他资源锁的释放(相互等待),除非一个用户的进程被终止。

几个死锁场景

  • 两个线程相互调用thread.join(), 导致互相等待同步结束。

系统优化怎么做-JVM优化之开篇

慎用线程join操作
  • 当两个线程使用嵌套的同步块时,一个线程占用了另一个线程的必需的锁,互相等待时被阻塞,就有可能出现死锁。 也可能多个线程形成环状锁,比如线程a等待线程b,线程b等待线程c,线程c等待线程a。线程a为了检测死锁,它需要递进地检测所有被b请求的锁。从线程b所请求的锁开始,线程a找到了线程c,发现线程c请求的锁被线程a自己持有着。这是它就知道发生了死锁。

系统优化怎么做-JVM优化之开篇

  • mysql死锁

系统优化怎么做-JVM优化之开篇

mysql中两个线程同时对两条记录做先读后写操作

避免死锁

  • 安全状态
找到一个分配资源的序列能让所有进程都顺利完成
  • 银行家算法
采用预分配策略检查分配完成时系统是否处在安全状态

检测死锁

  • visualvm(或其他工具)
监控线程状态,如果出现死锁得到相关代码位置
  • 死锁定理化间资源分配图
利用死锁定理化间资源分配图来分析死锁的存在
参见以下资料:
https://www.coursera.org/lect...

总结

本章主要讲了一些核心知识,主要为了让大家了解系统优化到底优化和解决什么问题,什么是优化的目标。后续章节会讲到tomcat的jmx配置,visualvm,tprofile等工具的使用。

思考题

jvm线程有哪些状态,这些线程大多处于什么样的状态分布, 我们可以称系统运行是健康的。