jStat

面试官问:平常你是怎么对Java服务进行调优的?

和自甴很熟 提交于 2020-12-05 02:55:43
点击关注上方“ 程序员私房菜 ”,设为“置顶或星标”,第一时间送达技术干货。 来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。 Java 应用性能的瓶颈点非常多,比如磁盘、内存、网络 I/O 等系统因素,Java 应用代码,JVM GC,数据库,缓存等。笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层、数据库层、框架层、JVM 层 ,如图 1 所示。 图 1.Java 性能优化分层模型 每层优化难度逐级增加,涉及的知识和解决的问题也会不同。比如应用层需要理解代码逻辑,通过 Java 线程栈 定位有问题代码行等;数据库层面需要 分析 SQL、定位死锁 等;框架层需要 懂源代码 , 理解框架 机制;JVM 层需要对 GC 的类型和工作机制有深入了解,对 各种 JVM 参数 作用了然于胸。 围绕 Java 性能优化,有两种最基本的分析方法: 现场分析法和事后分析法。 现场分析法 通过保留现场,再采用诊断工具分析定位。现场分析对线上影响较大,部分场景(特别是涉及到用户关键的在线业务时)不太合适。 事后分析法 需要尽可能多收集现场数据

排查jvm内存问题

被刻印的时光 ゝ 提交于 2020-11-23 22:50:12
1. jstat -gc pid 1000 每 1秒 输出 jvm gc的详情 可以 查看 年轻代的 GC情况 判断是否进行 频率 轻GC 来源: oschina 链接: https://my.oschina.net/u/2870118/blog/4437752

老板让我写个Bug,这可咋整?

五迷三道 提交于 2020-11-18 10:24:23
事情是这个样子的,作为兢兢业业、勤勤恳恳的小码农,虽无法做到沉迷代码不可自拔的地步。但是!我们早已练就一身捕获 Bug 的技能,铲除程序 Bug 已经成为人生宗旨,并且,打算就此长久保持。 本以为能安安稳稳、快快乐乐做码农,老板 的一句话,如雷贯耳,击碎了我的小初心,老板让我写个 Bug,这可咋整? 标题没有看错,真的是让我写个 Bug!刚接到这个需求时我内心没有丝毫波澜,甚至还有点激动。这可是我特长啊,终于可以光明正大的写 Bug 了。 先来看看具体是要干啥吧,其实主要就是要让一些负载很低的服务器额外消耗一些内存、CPU 等资源(至于背景就不多说了),让它的负载可以提高一些。 JVM 内存分配回顾 于是我刷刷一把梭的就把代码写好了,大概如下: 写完之后我就在想一个问题,代码中的 mem 对象在方法执行完之后会不会被立即回收呢?我想肯定会有一部分人认为就是在方法执行完之后回收。 我也正儿八经的去调研了下,问了一些朋友;果不其然确实有一部分认为是在方法执行完毕之后回收。 那事实情况如何呢?我做了一个试验。 我用以下的启动参数将刚才这个应用启动起来: 这样我就可以通过 JMX 端口远程连接到这个应用观察内存、GC 情况了。 如果是方法执行完毕就回收 mem 对象,当我分配 250M 内存时;内存就会有一个明显的曲线,同时 GC 也会执行。 这时观察内存曲线,如下图:

java之jvm

心不动则不痛 提交于 2020-11-10 06:27:21
1.JVM内存模型 线程独占:栈,本地方法栈,程序计数器 线程共享:堆,方法区 回答以上问题是需回答两个要点: 1. 各部分功能 2. 是否是线程共享 2.JMM与内存可见性 JMM是定义程序中变量的访问规则,线程对于变量的操作只能在自己的工作内存中进行,而不能直接对主内存操作.由于指令重排序,读写的顺序会被打乱,因此JMM需要提供原子性,可见性,有序性保证. 3.类加载与卸载 加载机制-双亲委派模式 双亲委派模式,即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器.父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载. 优点: 避免类的重复加载 避免Java的核心API被篡改 分代回收 分代回收基于两个事实:大部分对象很快就不使用了,还有一部分不会立即无用,但也不会持续很长时间. 年轻代->标记-复制 老年代->标记-清除 回收算法 1.CMS算法 1.7前主流垃圾回收算法,为标记-清楚算法,优点是并发收集,停顿小. 2.G1算法 1.9后默认的垃圾回收算法,特点保持高回收率的同时减少停顿.采用每次只清理一部分,而不是清理全部的增量式清理,以保证停顿时间不会过长 3.ZGC 1.11中提供的高效垃圾回收算法,针对大堆内存设计,可以处理TB级别的堆,可以做到10ms以下的回收停顿时间. 考察点 深入理解JVM内存模型 了解类加载机制

【jvm】深入理解java虚拟机读书笔记

ぐ巨炮叔叔 提交于 2020-11-09 14:25:53
1.内存分配和回收策略:java技术体系中提倡自动内存管理核心解决两个问题:给对象分配内存 回收分配给对象内存, 对象优先在新生代(Eden)分配 2.垃圾回收器分为:Serial收集器,ParNew收集器,Parallel Scavenge收集器,Serial Old收集器, Parallel Old收集器,CMS收集器,G1收集器 3.垃圾收集算法包括:标记-清除算法,复制算法,标记整理算法,分带收集算法 4.收集算法是内存回收的方法论,垃圾收集器是内存的具体实现 5.给一个系统定位问题,知识,经验是关键基础,数据是依据,工具是运用知识处理数据手段,这里数据包括:运行日志,异常堆栈,GC日志,线程快照(threaddump),堆转储快照(headpdump) 6.jps:列出正在运行中虚拟机进程,例如: jps -l 7.jstat:用于监视虚拟机各种运行状态信息命令,比如:类装载,内存,垃圾回收,JIT编译 例如:jstat -gc pid 8.jinfo:java配置信息工具 9.jmap:java内存映像工具 用于生产堆转储快照 10.jstack:java堆栈跟踪工具,用于生成虚拟机当前时刻的线程快照(threaddump), 5.2.3 32位系统最多到1.6GB基本无法再加大了 -XX:+HeapDumpOnOutOfMemoryError 7 虚拟机类加载机制 7

30道 有趣的 的 JVM 面试题

百般思念 提交于 2020-11-03 09:06:00
[toc] 前段时间在忙大数据,也对市场技术有了一个新的理解,学到老,学到老嘛。今天来和大家分享一下JVM常见的面试题,今天来和大家分享一下。大多都是大厂的实战面试题,来和小刘看一下吧! 1、JVN内存结构 方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。 Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。 JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame

JVM 内存了解

点点圈 提交于 2020-10-29 08:39:40
说说JVM的内存布局? Java虚拟机主要包含几个区域: 堆:堆Java虚拟机中最大的一块内存,是线程共享的内存区域,基本上所有的对象实例数组都是在堆上分配空间。堆区细分为Yound区年轻代和Old区老年代,其中年轻代又分为Eden、S0、S1 3个部分,他们默认的比例是8:1:1的大小。 栈:栈是线程私有的内存区域,每个方法执行的时候都会在栈创建一个栈帧,方法的调用过程就对应着栈的入栈和出栈的过程。每个栈帧的结构又包含局部变量表、操作数栈、动态连接、方法返回地址。 局部变量表用于存储方法参数和局部变量。当第一个方法被调用的时候,他的参数会被传递至从0开始的连续的局部变量表中。 操作数栈用于一些字节码指令从局部变量表中传递至操作数栈,也用来准备方法调用的参数以及接收方法返回结果。 动态连接用于将符号引用表示的方法转换为实际方法的直接引用。 元数据:在Java1.7之前,包含方法区的概念,常量池就存在于方法区(永久代)中,而方法区本身是一个逻辑上的概念,在1.7之后则是把常量池移到了堆内,1.8之后移出了永久代的概念(方法区的概念仍然保留),实现方式则是现在的元数据。它包含类的元信息和运行时常量池。 Class文件就是类和接口的定义信息。 运行时常量池就是类和接口的常量池运行时的表现形式。 本地方法栈:主要用于执行本地native方法的区域 程序计数器:也是线程私有的区域

jstat命令详解

心不动则不痛 提交于 2020-10-23 17:38:22
jstat命令使用 jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意:使用的jdk版本是jdk8. 类加载统计: C: \Users \Administrator >jstat -class 2060 Loaded Bytes Unloaded Bytes Time 15756 17355.6 0 0.0 11.29 1 2 3 1 2 3 Loaded:加载class的数量 Bytes:所占用空间大小 Unloaded:未加载数量 Bytes:未加载占用空间 Time:时间 编译统计 C:\Users\Administrator>jstat -compiler 2060 Compiled Failed Invalid Time FailedType FailedMethod 9142 1 0 5.01 1 org/apache/felix/resolver/ResolverImpl mergeCandidatePackages 1 2 3 1 2 3 Compiled:编译数量。 Failed:失败数量 Invalid:不可用数量 Time:时间 FailedType:失败类型 FailedMethod:失败的方法 垃圾回收统计 C: \Users

JVM调优调的是什么?是寂寞吗?

别说谁变了你拦得住时间么 提交于 2020-10-22 06:01:45
不,是GC。 gc永远会是 Java 程序员需要考虑的不稳定因素之一。 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 而GC的情景复杂又复杂,为了能更深刻的了解内存模型,参考《深入java虚拟机理解》,不定期更新JVM入门。 我自己遇到过一次内存泄漏,但不是线上环境,本地环境出现过一次,后来重新推包解决了,没有复现,那么平时的自用 服务器突然内存与磁盘IO暴增,你会如何调优?定位到具体线程后,是因为大对象占用空间造成,还是程序死循环了你如何解决?,关于JVM入门,以及JVM调优整理了地址请转至 https: //kkget .github.io/ 2020 /09/ 24 /JVM调优相关 https: //kkget .github.io/ 2020 / 10 / 13 /JVM从入门到放弃 以上内容不定期更新,今天主要从性能监控工具以及整理关于调优相关部分。 虚拟机性能监控工具 1.jps(JVM Porcess Status Tool) 功能:列出正在运行的虚拟机程序并显示执行主类名称以及进程ID( LVMID ,Local Virtiual Machine Identifier)。 jps -l 输出主类的全类名 jps -v 输出虚拟机启动时的JVM参数 格式 jps [ options ] [ hostid ] [root @zhaokk

面试常被问到,JDK 命令,你知道几个?

老子叫甜甜 提交于 2020-10-10 00:30:15
不知道你有没有过这样的经历,经常在面试的时候被问到 JDK 相关的命令,如何排查线上的问题,线上程序突然崩了要怎么处理,等等类似这种场景。其实并不是每个开发人员都能有这种实战经验,现实工作中往往很多开发人员是接触不到线上环境的。但是作为一个以 Java 谋生的程序员,如果连这些 JDK 自带的一些命令都不知道,那也说不过去。 阿粉以前也是这样,从来没有接触过线上环境,有任何问题都是运维人员去处理,因为相关制度不允许开发人员接触生产服务器。但是作为一个有梦想的开发人员,不能接触不代表就不用学,阿粉还是私下好好学习了一波,万一哪天就用上了呢。 JDK 常用命令 先给大家看一张总览图,然后我们一个个命令去使用一下,感受一下。 JPS 说明:首先通过上图,我们看到使用 jps 或者 jps | grep -v Jps 命令的时候是可以找到当前系统所有JVM。上面第二条命令是过滤本身的 Jps 程序。可以看到,输入这个命令后,会展示出当前系统所有的 Java 程序,并且会输出进程号 pid(也就是前面的数字)。 我们通过命令 man jps 简单的看下说明,如下: 可以看到 jps 命令有五个参数,每个参数的含义如下, -q: 不输出类名信息和参数,只输出进程号 -m:展示输入到 main 方法的参数 -l:展示 main class 全路径 -v:展示输入 JVM 的参数 -V:不输出路径