当前位置: 首页 > news >正文

自己做网站主机网站建设北京贵

自己做网站主机,网站建设北京贵,郑州网站制作,衡水百度seo我想你肯定遇到过内存溢出#xff0c;或是内存使用率过高的问题。碰到内存持续上升的情况#xff0c;其实我们很难从业务日志中查看到具体的问题#xff0c;那么面对多个进程以及大量业务线程#xff0c;我们该如何精准地找到背后的原因呢#xff1f; 1、常用的监控和诊断…我想你肯定遇到过内存溢出或是内存使用率过高的问题。碰到内存持续上升的情况其实我们很难从业务日志中查看到具体的问题那么面对多个进程以及大量业务线程我们该如何精准地找到背后的原因呢 1、常用的监控和诊断内存工具 工欲善其事必先利其器。平时排查内存性能瓶颈时我们往往需要用到一些 Linux 命令行或者 JDK 工具来辅助我们监测系统或者虚拟机内存的使用情况下面我就来介绍几种好用且常用的工具。 1.1、Linux 命令行工具之 top 命令 top 命令是我们在 Linux 下最常用的命令之一它可以实时显示正在执行进程的 CPU 使用率、内存使用率以及系统负载等信息。其中上半部分显示的是系统的统计信息下半部分显示的是进程的使用率统计信息。 除了简单的 top 之外我们还可以通过 top -Hp pid 查看具体线程使用系统资源情况 1.2、Linux 命令行工具之 vmstat 命令 vmstat 是一款指定采样周期和次数的功能性监测工具我们可以看到它不仅可以统计内存的使用情况还可以观测到 CPU 的使用率、swap 的使用情况。但 vmstat 一般很少用来查看内存的使用情况而是经常被用来观察进程的上下文切换。 r等待运行的进程数b处于非中断睡眠状态的进程数swpd虚拟内存使用情况free空闲的内存buff用来作为缓冲的内存数si从磁盘交换到内存的交换页数量so从内存交换到磁盘的交换页数量bi发送到块设备的块数bo从块设备接收到的块数in每秒中断数cs每秒上下文切换次数us用户 CPU 使用时间sy内核 CPU 系统使用时间id空闲时间wa等待 I/O 时间st运行虚拟机窃取的时间。 1.3、Linux 命令行工具之 pidstat 命令 pidstat 是 Sysstat 中的一个组件也是一款功能强大的性能监测工具我们可以通过命令yum install sysstat 安装该监控组件。之前的 top 和 vmstat 两个命令都是监测进程的内存、CPU 以及 I/O 使用情况而 pidstat 命令则是深入到线程级别。 通过 pidstat -help 命令我们可以查看到有以下几个常用的参数来监测线程的性能 常用参数 -u默认的参数显示各个进程的 cpu 使用情况-r显示各个进程的内存使用情况-d显示各个进程的 I/O 使用情况-w显示每个进程的上下文切换情况-p指定进程号-t显示进程中线程的统计信息。 我们可以通过相关命令例如 ps 或 jps查询到相关进程 ID再运行以下命令来监测该进程的内存使用情况 其中 pidstat 的参数 -p 用于指定进程 ID-r 表示监控内存的使用情况1 表示每秒的意思3 则表示采样次数。 其中显示的几个关键指标的含义是 Minflt/s任务每秒发生的次要错误不需要从磁盘中加载页Majflt/s任务每秒发生的主要错误需要从磁盘中加载页VSZ虚拟地址大小虚拟内存使用 KBRSS常驻集合大小非交换区内存使用 KB。 如果我们需要继续查看该进程下的线程内存使用率则在后面添加 -t 指令即可 我们知道Java 是基于 JVM 上运行的大部分内存都是在 JVM 的用户内存中创建的所以除了通过以上 Linux 命令来监控整个服务器内存的使用情况之外我们更需要知道 JVM 中的内存使用情况。JDK 中就自带了很多命令工具可以监测到 JVM 的内存分配以及使用情况。 1.4、JDK 工具之 jstat 命令 jstat 可以监测 Java 应用程序的实时运行情况包括堆内存信息以及垃圾回收信息。我们可以运行 jstat -help 查看一些关键参数信息 再通过 jstat -option 查看 jstat 有哪些操作 -class显示 ClassLoad 的相关信息-compiler显示 JIT 编译的相关信息-gc显示和 gc 相关的堆信息-gccapacity显示各个代的容量以及使用情况-gcmetacapacity显示 Metaspace 的大小-gcnew显示新生代信息-gcnewcapacity显示新生代大小和使用情况-gcold显示老年代和永久代的信息-gcoldcapacity 显示老年代的大小-gcutil显示垃圾收集信息-gccause显示垃圾回收的相关信息通 -gcutil同时显示最后一次或当前正在发生的垃圾回收的诱因-printcompilation输出 JIT 编译的方法信息。 它的功能比较多在这里我例举一个常用功能如何使用 jstat 查看堆内存的使用情况。我们可以用 jstat -gc pid 查看 S0C年轻代中 To Survivor 的容量单位 KBS1C年轻代中 From Survivor 的容量单位 KBS0U年轻代中 To Survivor 目前已使用空间单位 KBS1U年轻代中 From Survivor 目前已使用空间单位 KBEC年轻代中 Eden 的容量单位 KBEU年轻代中 Eden 目前已使用空间单位 KBOCOld 代的容量单位 KBOUOld 代目前已使用空间单位 KBMCMetaspace 的容量单位 KBMUMetaspace 目前已使用空间单位 KBYGC从应用程序启动到采样时年轻代中 gc 次数YGCT从应用程序启动到采样时年轻代中 gc 所用时间 (s)FGC从应用程序启动到采样时 old 代全 gcgc 次数FGCT从应用程序启动到采样时 old 代全 gcgc 所用时间 (s)GCT从应用程序启动到采样时 gc 用的总时间 (s)。 1.5、JDK 工具之 jstack 命令 这个工具在模块三的[答疑课堂]中介绍过它是一种线程堆栈分析工具最常用的功能就是使用 jstack pid 命令查看线程的堆栈信息通常会结合 top -Hp pid 或 pidstat -p pid -t 一起查看具体线程的状态也经常用来排查一些死锁的异常。 每个线程堆栈的信息中都可以查看到线程 ID、线程的状态wait、sleep、running 等状态以及是否持有锁等。 1.6、JDK 工具之 jmap 命令 在[第 23 讲]中我们使用过 jmap 查看堆内存初始化配置信息以及堆内存的使用情况。那么除了这个功能我们其实还可以使用 jmap 输出堆内存中的对象信息包括产生了哪些对象对象数量多少等。 我们可以用 jmap 来查看堆内存初始化配置信息以及堆内存的使用情况 我们可以使用 jmap -histo[:live] pid 查看堆内存中的对象数目、大小统计直方图如果带上 live 则只统计活对象 我们可以通过 jmap 命令把堆内存的使用情况 dump 到文件中 我们可以将文件下载下来使用 MAT 工具打开文件进行分析 下面我们用一个实战案例来综合使用下刚刚介绍的几种工具具体操作一下如何分析一个内存泄漏问题。 2、实战演练 我们平时遇到的内存溢出问题一般分为两种一种是由于大峰值下没有限流瞬间创建大量对象而导致的内存溢出另一种则是由于内存泄漏而导致的内存溢出。 使用限流我们一般就可以解决第一种内存溢出问题但其实很多时候内存溢出往往是内存泄漏导致的这种问题就是程序的 BUG我们需要及时找到问题代码。 下面我模拟了一个内存泄漏导致的内存溢出案例我们来实践一下。 我们知道ThreadLocal 的作用是提供线程的私有变量这种变量可以在一个线程的整个生命周期中传递可以减少一个线程在多个函数或类中创建公共变量来传递信息避免了复杂度。但在使用时如果 ThreadLocal 使用不恰当就可能导致内存泄漏。 这个案例的场景就是 ThreadLocal下面我们创建 100 个线程。运行以下代码系统一会儿就发送了内存溢出异常 final static ThreadPoolExecutor poolExecutor new ThreadPoolExecutor(100, 100, 1, TimeUnit.MINUTES,new LinkedBlockingQueue());// 创建线程池通过线程池保证创建的线程存活final static ThreadLocalByte[] localVariable new ThreadLocalByte[]();// 声明本地变量RequestMapping(value /test0)public String test0(HttpServletRequest request) {poolExecutor.execute(new Runnable() {public void run() {Byte[] c new Byte[4096*1024];localVariable.set(c);// 为线程添加变量}});return success;}RequestMapping(value /test1)public String test1(HttpServletRequest request) {ListByte[] temp1 new ArrayListByte[]();Byte[] b new Byte[1024*20];temp1.add(b);// 添加局部变量return success;} 在启动应用程序之前我们可以通过 HeapDumpOnOutOfMemoryError 和 HeapDumpPath 这两个参数开启堆内存异常日志通过以下命令启动应用程序 java -jar -Xms1000m -Xmx4000m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/heapdump.hprof -Xms1g -Xmx1g -XX:PrintGCTimeStamps -XX:PrintGCDetails -Xloggc:/tmp/heapTest.log heapTest-0.0.1-SNAPSHOT.jar 首先请求 test0 链接 10000 次之后再请求 test1 链接 10000 次这个时候我们请求 test1 的接口报异常了。 通过日志我们很好分辨这是一个内存溢出异常。我们首先通过 Linux 系统命令查看进程在整个系统中内存的使用率是多少最简单就是 top 命令了。 从 top 命令查看进程的内存使用情况可以发现在机器只有 8G 内存且只分配了 4G 内存给 Java 进程的情况下Java 进程内存使用率已经达到了 55%再通过 top -Hp pid 查看具体线程占用系统资源情况。 再通过 jstack pid 查看具体线程的堆栈信息可以发现该线程一直处于 TIMED_WAITING 状态此时 CPU 使用率和负载并没有出现异常我们可以排除死锁或 I/O 阻塞的异常问题了。 我们再通过 jmap 查看堆内存的使用情况可以发现老年代的使用率几乎快占满了而且内存一直得不到释放 通过以上堆内存的情况我们基本可以判断系统发生了内存泄漏。下面我们就需要找到具体是什么对象一直无法回收什么原因导致了内存泄漏。 我们需要查看具体的堆内存对象看看是哪个对象占用了堆内存可以通过 jstat 查看存活对象的数量 Byte 对象占用内存明显异常说明代码中 Byte 对象存在内存泄漏我们在启动时已经设置了 dump 文件通过 MAT 打开 dump 的内存日志文件我们可以发现 MAT 已经提示了 byte 内存异常 再点击进入到 Histogram 页面可以查看到对象数量排序我们可以看到 Byte[] 数组排在了第一位选中对象后右击选择 with incomming reference 功能可以查看到具体哪个对象引用了这个对象。 在这里我们就可以很明显地查看到是 ThreadLocal 这块的代码出现了问题。 3、总结 在一些比较简单的业务场景下排查系统性能问题相对来说简单且容易找到具体原因。但在一些复杂的业务场景下或是一些开源框架下的源码问题相对来说就很难排查了有时候通过工具只能猜测到可能是某些地方出现了问题而实际排查则要结合源码做具体分析。 可以说没有捷径排查线上的性能问题本身就不是一件很简单的事情除了将今天介绍的这些工具融会贯通还需要我们不断地去累积经验真正做到性能调优。 4、思考题 除了以上我讲到的那些排查内存性能瓶颈的工具之外你知道要在代码中对 JVM 的内存进行监控常用的方法是什么 问题 老师是否可以讲下如何避免threadLocal内存泄漏呢 我们知道ThreadLocal是基于ThreadLocalMap实现的这个Map的Entry继承了WeakReference而Entry对象中的key使用了WeakReference封装也就是说Entry中的key是一个弱引用类型而弱引用类型只能存活在下次GC之前。 如果一个线程调用ThreadLocal的set设置变量当前ThreadLocalMap则新增一条记录但发生一次垃圾回收此时key值被回收而value值依然存在内存中由于当前线程一直存在所以value值将一直被引用。. 这些被垃圾回收掉的key就存在一条引用链的关系一直存在Thread – ThreadLocalMap–Entry–Value这条引用链会导致Entry不会回收Value也不会回收但Entry中的Key却已经被回收的情况造成内存泄漏。 我们只需要在使用完该key值之后通过remove方法remove掉就可以防止内存泄漏了 老师内存泄露和内存溢出具体有啥区别 内存泄漏是指不再使用的对象无法得到及时的回收持续占用内存空间从而造成内存空间的浪费。例如我们之前在第3讲中聊到的在Java6中substring方法可能会导致内存泄漏情况发生。当调用substring方法时会调用new string构造函数此时会复用原来字符串的char数组而如果我们仅仅是用substring获取一小段字符而原本string字符串非常大的情况下substring的对象如果一直被引用由于substring的里面的char数组仍然指向原字符串此时string字符串也无法回收从而导致内存泄露。 内存溢出则是发生了OutOfMemoryException内存溢出的情况有很多例如堆内存空间不足栈空间不足以及方法区空间不足都会发生内存溢出异常。 内存泄漏与内存溢出的关系内存泄漏很容易导致内存溢出但内存溢出不一定是内存泄漏导致的。
http://www.zqtcl.cn/news/587080/

相关文章:

  • 科技信息网站系统建设方案建筑设计专业世界大学排名
  • 做网站运营的简历小型视频网站建设
  • 福建省亿力电力建设有限公司网站网页设计html代码大全动物
  • 如何建网站赚取佣金企业网站的在线推广方法有
  • 嵌入式转行到网站开发免费秒玩小游戏
  • 采购网站排名不需要证件做网站
  • wordpress添加用户登录东莞网络公司seo优化
  • 哪些企业网站使用水墨风格设计免费
  • 河北邯郸做网站的公司哪家好云南建站公司
  • 网站开发如何给用户发邮件wordpress中文插件下载
  • 专业外贸网站建设公司排名网站错误列表
  • 魔站建站系统哪家好扬州网站开发公司电话
  • 合伙做网站网络公司网站建设首页
  • 网站建设项目经理深圳在线官网
  • 网站开发技术及应用wordpress自定义类型使用模板
  • 网站颜色 字体代销网站源码
  • 做二手车有哪些网站有哪些手续翠竹林wordpress主题
  • 商城网站开发报价单献县做网站价格
  • 做网站和推广需要多少钱诚信企业查询系统
  • c 2015 做网站网站设计技术有哪些?
  • 安丘网站开发主播网站建立
  • 档案网站的建设wordpress英文主题 汉化
  • 网站建设礼品南充网站建设工作室
  • 电子商务网站建设概念wordpress 扫码支付宝
  • 上海做网站谁好营销型网站框架图
  • 太仓企业网站建设价格wordpress自动同步插件
  • 微信网站是什么淄博周村网站建设哪家好
  • 廊坊网站建设价格网站建设维护的方案
  • 站长工具综合权重查询怎样做招聘网站
  • 广东新闻联播2020sem对seo的影响有哪些