jStat

《深入理解Java虚拟机:JVM高级特性与最佳实践》读书笔记

二次信任 提交于 2020-10-07 09:52:34
目录 第一部分 走进Java 一、走进Java 第二部分 自动内存管理机制 二、内存区域和内存溢出异常 1、运行时数据区 2、HotSpot虚拟机对象探秘 3、OutOfMemoryError异常 三、垃圾收集器和内存分配策略 1、对象已死吗?如何确定对象是否还“活着” 2、垃圾回收算法 3、HotSpot算法实现 4、垃圾收集器 5、内存分配和回收策略 四、虚拟机性能监控与故障处理工具 1、jps 2、jstat。监视JVM内存工具。 3、jinfo。查看和修改JVM运行参数 4、jmap。命令用于生成heap dump文件 5、jstack。Java堆栈跟踪工具 五、常见JVM配置说明 1、JVM配置 1.3、参数说明 G1最佳实践 1、不断调优暂停时间指标 2、不要设置新生代和老年代的大小 3、关注Evacuation Failure 1、Minor GC、Major GC和Full GC之间的区别 2、常用命令 3、问题排查 七、虚拟机类加载机制 1、虚拟机把表示类的class文件加载到内存,经过校验、转换解析、初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制 2、类加载的时机 3、类加载的过程 4、类加载器 第五部分 高效并发 十二、Java内存模型与线程 1、硬件的效率与一致性 2、Java内存模型 3、Java与线程 十三、线程安全与锁优化

你的 IDEA 是如何配置的?卡不卡?试试这样配置

社会主义新天地 提交于 2020-10-06 09:24:24
本文作者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响。 Don’t be a Scrooge and give your IDE some more memory 不要做守财奴,给IDE多留点内存吧。 昨天,大家就是否自定义 IntelliJ IDEA 的内存设置进行了讨论,有些人选择默认设置,有些人会对默认的设置进行简单的变更,还有一些开发者会基于他们的需求进行全面复杂的设置。笔者目前的工作是处理几个微服务项目和一个老项目,而客户的核心业务需求非常大。对 IntelliJ IDEA 内存进行简单设置以后,笔者明显感受到了该 IDE 在速度和响应方面的改善。但当时笔者并未进行具体的测量,所以这只是主观感受而已。 不过,参与讨论的一位开发者给笔者发了一份他的设置,虽然是针对同个项目,该设置却极其复杂。笔者对自己的设置并无不满,但非常好奇,这些完全不同的设置对比 JetBrains 提供的默认设置,会有怎样的不同。 目标 笔者的计划是,在一个接近日常开发项目的场景下(加载一个大项目、加载2、3个微服务、git pull 后刷新大项目),测试各个设置带来的效果,并选出内存消耗和速度都达到最优时的最佳设置。 测试机器和项目 笔记本电脑:MacBook Pro Retina, 2.3GHz Intel Core

看过很多的JVM文章,实战中却依然不知道如何进行分析排查?

五迷三道 提交于 2020-10-02 03:09:15
  今天面了个32岁的Java程序员,各方面都挺好,问啥都会,对于JVM调优问题,答得还行,最后问了个Go语言GC问题,就答不上来了,走时几乎落泪...唉!    细想想...   当面试官向你提问JVM的实战问题时,你是否感觉到无所适从?   想解决生产环境中的GC问题,你是否感觉到狗咬刺猬,无处下嘴?   面对JVM的海量参数,你是否感觉到迷茫无助?   看过很多的JVM文章,但当遇到了生产环境中真实问题的时候,你是否依然不知道如何进行分析排查?   如果是这样,我觉得我们大家先想清楚在 金九银十 这个时间段“ 自己想要什么 ”最为重要   我认为是 “ 实 战” !    “实战” 可以让我们 快速消除痛点,解决面试,积累实战经验 。   在这里小编推荐你,拿出2小时的时间   赶紧参加【 马士兵 老师】的 「JVM实战调优」 集训营   马老师带你横扫一切关于JVM的面试问题,吊打所有敢于提问JVM的面试官。   让你在简历中,填写上JVM调优经历,为升职加薪添上浓墨重彩的一笔。    往下看哦...       下面这些内容,全网首讲,你从未听过,且只讲一次   Go语言内存管理和Java的异同,Rust语言为什么不需要GC?   Golang的内存管理和Jvm有何不同?   Golang的gc算法和Jvm有何不同?   Golang的内存调优应该如何做?  

【转】JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

放肆的年华 提交于 2020-08-20 09:34:28
JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历与各位分享解决这些问题的办法. 作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端、服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存和CPU资源消耗急剧增加,持续增长到出现java.lang.OutOfMemoryError为止.经过分析Java内存泄漏是破坏系统的主要因素.这里与大家分享我们在开发过程中遇到的Java内存泄漏的检测和处理解决过程. 一. Java是如何管理内存 为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的.Java的内存管理就是对象的分配和释放问题.在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但它只能回收无用并且不再被其它对象引用的那些对象所占用的空间. Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收

1.3万字13图!JVM 史上最最最完整深入解析

◇◆丶佛笑我妖孽 提交于 2020-08-18 12:45:41
工作之余,想总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1,64位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中

好程序员Java培训分享Java性能常见命令有哪些

与世无争的帅哥 提交于 2020-08-17 17:20:58
  好程序员Java培训分享Java性能常见命令有哪些,性能优化一向是后端服务优化的重点,但是线上性能故障问题不是经常出现,或者受限于业务产品,根本就没办法出现性能问题,包括笔者自己遇到的性能问题也不多,所以为了提前储备知识,当出现问题的时候不会手忙脚乱。   既然是定位问题,肯定是需要借助工具,我们先了解下需要哪些工具可以帮忙定位问题。   top命令   top命令是我们最常用的Linux命令之一,它可以实时的显示当前正在执行的进程的CPU使用率,内存使用率等系统信息。top -Hp pid 可以查看线程的系统资源使用情况。   vmstat命令   vmstat是一个指定周期和采集次数的虚拟内存检测工具,可以统计内存,CPU,swap的使用情况,它还有一个重要的常用功能,用来观察进程的上下文切换。字段说明如下:   r: 运行队列中进程数量(当数量大于CPU核数表示有阻塞的线程)   b: 等待IO的进程数量   swpd: 使用虚拟内存大小   free: 空闲物理内存大小   buff: 用作缓冲的内存大小(内存和硬盘的缓冲区)   cache: 用作缓存的内存大小(CPU和内存之间的缓冲区)   si: 每秒从交换区写到内存的大小,由磁盘调入内存   so: 每秒写入交换区的内存大小,由内存调入磁盘   bi: 每秒读取的块数   bo: 每秒写入的块数   in:

4 GC分析 命令调优

此生再无相见时 提交于 2020-08-17 16:25:33
GC分析 命令调优 0 主要内容: ① JVM常用内存调优命令:(重点掌握) JVM在内存调优方面,提供了几个常用的命令,分别为 jps,jinfo,jstack,jmap以及jstat命令 。分别介绍如下: jps: 主要用来输出JVM中运行的进程状态信息,一般使用jps命令来查看进程的状态信息,包括JVM启动参数等。 jinfo: 主要用来观察进程运行环境参数等信息。 jstack: 主要用来查看某个Java进程内的线程堆栈信息。jstack pid 可以看到当前进程中各个线程的状态信息,包括其持有的锁和等待的锁。 jmap: 用来查看堆内存使用状况。jmap -heap pid可以看到当前进程的堆信息和使用的GC收集器,包括年轻代和老年代的大小分配等 jstat: 进行实时命令行的监控,包括堆信息以及实时GC信息等。可以使用jstat -gcutil pid1000来每隔一秒来查看当前的GC信息。 来源: oschina 链接: https://my.oschina.net/u/4419899/blog/4489714

Java 内存分区之什么是 CCS区 Compressed Class Space 类压缩空间

╄→гoц情女王★ 提交于 2020-08-17 06:51:42
了解到什么是ccs区,一般都是实际执行了jstat -gc 之后,看Java堆的gc相关的几个分区的gc信息,前面的s0,s1,e区,o区,还好猜,研究过分区的,不难猜出来这个分区是啥意思,M区虽然不知道是Metaspace元空间,但是错把这个M区当成Method area 方法区,也说的过去。这个ccsc就不好说了。之前的看的文章都没人说这个区是啥。 Java之jstat的用法:Java虚拟机 统计信息查看 工具 不了解这几个简写单词是啥意思的,可以参考一下之前的这个jstat的文章,里面对每一列的title的简写都做了解释。 什么是 Compressed Class Space 在 64 位平台上,HotSpot 使用了两个压缩优化技术,Compressed Object Pointers (“CompressedOops”) 和 Compressed Class Pointers。 压缩指针,指的是在 64 位的机器上,使用 32 位的指针来访问数据(堆中的对象或 Metaspace 中的元数据)的一种方式。 这样有很多的好处,比如 32 位的指针占用更小的内存,可以更好地使用缓存,在有些平台,还可以使用到更多的寄存器。 当然,在 64 位的机器中,最终还是需要一个 64 位的地址来访问数据的,所以这个 32 位的值是相对于一个基准地址的值。 下面将描述 Compressed

fullGC 频繁导致CPU飙高

喜你入骨 提交于 2020-08-16 14:46:52
鄙人上班正在摸鱼中,突然后收到领导电话服务 报 503 好吧吓死了赶紧百度 http 503 :因暂时超载或临时维护,您的 Web 服务器目前无法处理 HTTP 请求。 其含义是, 这是一个暂时情况,会有一些延误, 过 后将会得到缓解。 有些服务器在这种情况下也许干脆拒绝套接字(socket) 连接,在这种情况下,可能会由于套接字建立超时而产生不同的错误信息。 说白了 服务压力或者别的原因 忙不过来了 我自己组装了一笔报文 用curl 脚本发送 发现 十多秒都没返回 开始下面排查 以下所有截图都不是 demo 而是真实样例 指令TOP top: 提供实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序 load average:系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 Cpu(s):显示CPU信息 75.9%us 用户空间占用CPU百分比 0.4%sy 内核和中断占用CPU百分比 0.0%ni 用户进程空间内改变过优先级的进程占用CPU百分比 23.7%id 空闲CPU百分比 0.0%wa 等待输入输出的CPU时间百分比 0.0%hi 硬中断(Hardware IRQ)占用CPU的百分比 0.0%si 软中断(Software Interrupts

《深入理解JVM.2nd》笔记(四):虚拟机性能监控与故障处理工具

孤街浪徒 提交于 2020-08-15 16:33:22
概述 给一个系统定位问题的时候, 知识、经验 是关键基础, 数据 是依据, 工具 是运用知识处理数据的手段。这里说的 数据 包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(headdump/hprof文件)等。 经常使用适当的虚拟机监控和分析工具可以加快分析数据、定位解决问题的速度,但在学习工具前,也应当意识到 工具永远都是知识技能的一层包装 。 JDK的命令行工具 这些工具比较小巧,只因这些命令行工具大多数是JDK/lib/tools.jar类库的一层薄包装而已 JDK开发团队选择采用Java代码来实现这些监控工具是有特别用意的 :当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程Telnet到服务器上都可能会受到限制。借助tools.jar类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能。 下表是Sun JDK监控和故障处理工具 名称 主要作用 jps JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 jstat JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据 jinfo Configuration Info for Java,显示虚拟机配置信息 jmap Memory Map for