zoukankan      html  css  js  c++  java
  • JVM优化

    JVM优化之开篇

    https://www.cnblogs.com/changsong/p/9511084.html

    系统优化怎么做-JVM优化之开篇
    大家好,这里是「聊聊系统优化 」,并在下列地址同步更新
    在这里我会从基于J2EE系统及互联网架构方面,来谈谈系统优化的各个方面,干货满满,欢迎订阅及关注!

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

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

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

    JDK1.7及以下

    JDK1.8下,PermGen替换成Vm MetaSpace
    Heap域
    全局被所有线程分享
    存所有对象及集合对象
    方法域
    全局被所有线程分享
    存所有类的结构定义包含属性,方法及构造函数等
    Thread1.N
    本地私有栈,一个线程一个栈
    保持着所有在Heap域的对象引用(4byte长度)
    存储本地局部变量的存储(基础数据类型),程序运行状态,方法返回值
    内存泄漏的分类
    堆内存泄漏 - 比较常见
    持久代内存泄漏
    栈内存泄漏
    系统资源内存泄漏 -比较常见
    线程相关知识
    JVM线程状态迁移

    线程状态
    初始化(New):初期创建,启动后则进入可执行状态
    可执行状态(Runnable): 只要获取CPU时间,则开始执行
    运行状态(Running): 正在使用CPU执行
    阻塞状态(Bloked)

    等待阻塞(wait)
    同步阻塞(synchronized)
    睡眠阻塞(sleep)
    Join阻塞: 等待join子线程结束后,主线程才能执行,将异步执行的线程合并为同步的线程
    结束状态: 线程执行完毕或者异常退出
    性能监控关注点
    系统线程总数
    死锁线程 需要优先解决
    线程Bloked总数数量

    线程Bloked多的情况下,考虑对待处理数据进行分片,进行多通道,多线程处理提高系统性能
    如果系统处理慢,但CPU占用一直很低,就需要梳理系统处理流程,串行处理该并行处理,并行处理流程提高并发来解决。
    线程死锁
    当两个或者多个线程尝试获取其他资源的锁,而每个线程又陷入无限等待其他资源锁的释放(相互等待),除非一个用户的进程被终止。

    几个死锁场景
    两个线程相互调用Thread.join(), 导致互相等待同步结束。

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

    MySql死锁

    MySql中两个线程同时对两条记录做先读后写操作
    避免死锁
    安全状态
    找到一个分配资源的序列能让所有进程都顺利完成
    银行家算法
    采用预分配策略检查分配完成时系统是否处在安全状态
    检测死锁
    VisualVM(或其他工具)
    监控线程状态,如果出现死锁得到相关代码位置
    死锁定理化间资源分配图
    利用死锁定理化间资源分配图来分析死锁的存在
    参见以下资料:
    https://www.coursera.org/lect...
    总结
    本章主要讲了一些核心知识,主要为了让大家了解系统优化到底优化和解决什么问题,什么是优化的目标。后续章节会讲到tomcat的JMX配置,VisualVM,Tprofile等工具的使用。

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

  • 相关阅读:
    Javascript动画模拟
    C#导出Excel
    Google Maps API
    动态管理视图和函数
    HttpWebRequest和HttpWebResponse实例
    从零开始学Java 第19章 网络编程
    从零开始学Java 第15章 Java输入输出流
    从零开始学Java 第21章 集合框架
    从零开始学Java 第13章 多线程
    从零开始学Java 第14章 Applet程序
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/9559922.html
Copyright © 2011-2022 走看看