系统优化怎么做-JVM优化之开篇
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新
- 博客园:http://www.cnblogs.com/changsong/
- 知乎专栏:https://zhuanlan.zhihu.com/youhua
- 思否专栏:https://segmentfault.com/blog/youhua
- 全网私活,免费订阅: http://www.zsihuo.com
在这里我会从基于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线程有哪些状态,这些线程大多处于什么样的状态分布, 我们可以称系统运行是健康的。
系统优化怎么做-JVM优化之开篇的更多相关文章
- 系统优化怎么做-JVM优化之VisualVM
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- 给hive的metastore做JVM优化
最近在测试环境下,hive的metastore不稳定,于是做一次JVM优化 在hive-env.sh中 export HADOOP_HOME=/opt/cdh/hadoop-2.6.0-cdh5.14 ...
- 系统优化怎么做-Tomcat优化
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- 系统优化怎么做-SQL优化
大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...
- JVM 优化问题
jvm 优化问题 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...
- JVM基础系列开篇:为什么要学虚拟机?
跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并 ...
- JVM规范系列开篇:为什么要读JVM规范?
许多人知道类加载机制.JVM内存模型,但他们可能不知道什么是<Java虚拟机规范>.对于Java开发来说,<Java虚拟机规范>才是最为官方.准确的一个文档,了解这个规范可以让 ...
- 性能优化系列三:JVM优化
一.几个基本概念 GCRoots对象都有哪些 所有正在运行的线程的栈上的引用变量.所有的全局变量.所有ClassLoader... 1.System Class.2.JNI Local3.JNI Gl ...
- java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置
过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃 ...
随机推荐
- PHP获取当前时间戳
PHP提供了专门的获取当前时间戳的函数,那就是time()函数. time()函数获取当前的UNIX时间戳,返回值为从时间戳纪元(格林威治时间1970年1月1日 00:00:00)到当前的秒数. ...
- svn怎么下载代码到本地
1. 在我们安装好svn时,在指定的目录中点击鼠标右键SVN Checkout,弹出以下窗口.(在文件夹下各自建好前后台的文件夹分别check) 2. 在URL of repository:(存储库的 ...
- Django 常用字段和参数
一.ORM字段 类型 说明 AutoField 一个自动增加的整数类型字段.通常你不需要自己编写它,Django会自动帮你添加字段:`id = models.AutoField(primary_key ...
- JQuery总结摘要
一 概述 1.JQuery是什么? JQuery是一个JavaScript库,简化了JS操作,扩展了JS功能. 2.分离原则 JQuery遵循导入与使用分离的原则,即使用一个<script> ...
- VMWARE错误-"VirtualInfrastructure.Utils.ClientsXml"的类型初始值设定项引发异常
异常信息:"VirtualInfrastructure.Utils.ClientsXml"的类型初始值设定项引发异常. 解决方案:以管理员的身份运行客户程序
- CentOS 7运维管理笔记(10)----MySQL源码安装
MySQL可以支持多种平台,如Windows,UNIX,FreeBSD或其他Linux系统.本篇随笔记录在CentOS 7 上使用源码安装MySQL的过程. 1.下载源码 选择使用北理工的镜像文件: ...
- 分分钟搞懂 HD 钱包
转自:http://blog.sina.com.cn/s/blog_12ce70a430102v8c7.html 第一次看到 HD 这个词被用在比特币钱包中时,很容易就把它理解成硬件(Hardware ...
- Spring3实战第二章第二小节 IOC依赖注入 list和map集合
Spring有多种依赖注入的形式,本篇文章仅介绍Spring通过xml进行IOC配置的方式. 1.Set注入 2.构造器注入 平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new ...
- 旋转数组的最小数字(C++ 和 Python 实现)
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的 ...
- SQL Server ->> FileTable
FileTable是SQL Server 2012的新特性之一.它是基于SQL Server 2008的FILESTREAM特性上而来的,允许我们把Windows文件存储在SQL Server中,让S ...