jvm调优

jvm 性能调优工具之 jstat

限于喜欢 提交于 2019-11-29 19:06:02
概述 Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。 jstat 用法 option: 参数选项 -t: 可以在打印的列加上Timestamp列,用于显示系统运行的时间 -h: 可以在周期性数据数据的时候,可以在指定输出多少行以后输出一次表头 vmid: Virtual Machine ID( 进程的 pid) interval: 执行每次的间隔时间,单位为毫秒 count: 用于指定输出多少次记录,缺省则会一直打印 option 可以从下面参数中选择 -class 显示ClassLoad的相关信息; -compiler 显示JIT编译的相关信息; -gc 显示和gc相关的堆信息; -gccapacity    显示各个代的容量以及使用情况; -gcmetacapacity 显示metaspace的大小 -gcnew 显示新生代信息; -gcnewcapacity 显示新生代大小和使用情况; -gcold 显示老年代和永久代的信息; -gcoldcapacity 显示老年代的大小; -gcutil   显示垃圾收集信息;

Tomcat调优配置

不羁的心 提交于 2019-11-29 16:18:06
以解压版本的tomcat7.0为例 1. JVM启动参数修改 在tomcat 的bin 下catalina.bat 里 rem Guess CATALINA_HOME if not defined set CURRENT_DIR=%cd% 后面添加 set JAVA_OPTS=-Xms1024m -Xmx1024m -Xmn256m -XX:PermSize=128M -XX:MaxPermSize=128m -Djava.awt.headless=true -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:D:\log\jvm\gc.log 2. 配置管理用户 在tomcat解压目录下找到conf/tomcat-users.xml 在倒数第二行添加: <role rolename="manager-gui"/> < user username="admin" password="admin" roles="manager-gui"/> 打开:http://localhost:8080/manager/status 以admin/admin 登录查看tomcat状态。 来源: https://blog.csdn.net/geekooler/article/details/100852569

Java 内存区域和GC机制

社会主义新天地 提交于 2019-11-28 23:24:12
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况   Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,放置出现内存泄露和溢出问题。   关于JVM,需要说明一下的是,目前使用最多的Sun公司的JDK中,自从 1999年的JDK1.2开始直至现在仍在广泛使用的JDK6,其中默认的虚拟机都是HotSpot。2009年,Oracle收购Sun,加上之前收购 的EBA公司,Oracle拥有3大虚拟机中的两个:JRockit和HotSpot,Oracle也表明了想要整合两大虚拟机的意图,但是目前在新发布 的JDK7中,默认的虚拟机仍然是HotSpot,因此本文中默认介绍的虚拟机都是HotSpot,相关机制也主要是指HotSpot的GC机制。  

JVM垃圾回收算法图解

女生的网名这么多〃 提交于 2019-11-28 19:47:04
参考文档:https://www.toutiao.com/a6691966641242112516/ 垃圾搜集算法 标记-清除法 标记-清除算法采用从根集合(GC Roots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,如下图所示。 标记-清除算法不需要进行对象的移动,只需对不存活的对象进行处理,在存活对象比较多的情况下极为高效。但由于标记-清除算法直接回收不存活的对象,因此会造成内存碎片。 复制算法 复制算法的提出是为了克服句柄的开销和解决内存碎片的问题。 它开始时把堆分成 一个对象面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾收集就从根集合(GC Roots)中扫描活动对象,并将每个活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞)。这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。 标记-整理算法 标记-整理算法采用标记-清除算法一样的方式进行对象的标记,但在清除时不同,在回收不存活的对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。 标记-整理算法是在标记-清除算法的基础上,又进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题。 具体流程见下图: 分代收集算法 分代收集算法是目前大部分JVM的垃圾收集器采用的算法

支付宝的性能测试

谁说我不能喝 提交于 2019-11-28 11:19:58
支付宝的性能测试 作者 付丽华 孙玉星 发布于 2014年5月22日 | 6 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 一、性能测试支付宝场景介绍 2013年双11过程当中,促销开启的第一分钟内支付宝的交易总额就突破了一亿元,短时间内大量用户涌入的情况下,如何保证用户的支付顺畅,是对支付宝应用系统的一个极大的挑战。 支付宝的性能测试场景分为性能基线测试,项目性能测试。 任意一笔交易过来,我们都需要对交易进行风险扫描,对于有可能是账户盗用的交易,我们会把这笔支付直接拒绝掉,或者通过手机校验码等方式进行风险释放。 相关厂商内容 滴滴出行iOS客户端架构演进之路! 微信客户端如何应对弱网络! 函数式编程中的Swift与Swift中的函数式编程! 你离成为一位合格的技术领导者还有多远? 国际范 最前沿 不容错过的容器技术盛会 相关赞助商 GMTC全球移动技术大会2016年6月24日-25日,北京, 点击了解详情 ! 我们有一个老的扫描平台A,现在需要构建一个新的扫描平台B,对A中关键技术进行升级,并增加额外的功能。扫描的策略是存储在DB中的,需要通过发布来更新到应用服务器的内存中。 二、性能测试需求分析和方案制定 a. 需求挖掘 1),查看业务方的显性需求。业务方给到的需求为平台B的分析性能要优于平台A的性能

Java 8新特性探究(九)跟OOM:Permgen说再见吧

北战南征 提交于 2019-11-28 11:19:37
很多开发者都在其系统中见过“java.lang.OutOfMemoryError: PermGen space”这一问题。这往往是由类加载器相关的内存泄漏以及新类加载器的创建导致的,通常出现于代码热部署时。相对于正式产品,该问题在开发机上出现的频率更高,在产品中最常见的“问题”是默认值太低了。常用的解决方法是将其设置为256MB或更高。 PermGen space简单介绍 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。 JVM 种类有很多,比如 Oralce-Sun Hotspot, Oralce JRockit, IBM J9, Taobao JVM(淘宝好样的!)等等。当然武林盟主是Hotspot了,这个毫无争议。 需要注意的是,PermGen space是Oracle-Sun Hotspot才有 ,JRockit以及J9是没有这个区域。 元空间(MetaSpace

深度理解JVM

China☆狼群 提交于 2019-11-28 03:02:04
深入理解 java 虚拟机 要讲的内容 了解历史 垃圾回收机制 性能监控工具 性能调优案例实战 认识类的文件结构 类加载机制 字节码执行引擎 虚拟机编译及运行时优化 Java 线程高级 1. 环境搭建 安装 jdk 2. 内存溢出场景模拟 public class Test01 { public static void main(String[] args) { //测试内存溢出 List<Demo> list = new ArrayList<Demo>(); while(true) { list.add(new Demo()); } //不停的创建对象会一直消耗堆内存知道内存消耗完(其实不会真的将8G的内存都消耗完) //当达到一个上线时就会报出这个错误了,这时就会报出一个内存溢出 //OutOfMemoryError } } class Demo{ } 可以在你的项目下找到这个快照的错误文件 但是我们是看不懂的所以需要到 http://www.eclipse.org/mat/downloads.php 去下载一个 eclipse 的 MemoryAnalyzer 分析工具 如果你直接下载会非常慢所以选择一个其他的镜像这样下载就会快点 下载解压后打开 点击 file->Open Heap Dump 选中产生的那个文件 然后生成一个 选中这个图标可以查看我们的堆内存运行情况

jvm调优

放肆的年华 提交于 2019-11-27 12:43:14
一、OOM 1.top 的时候发现负载很高 2.jstat可以观察到classloader,compiler,gc相关信息 jstat -gcutil pid 查看各个区的占比,和gc的次数。244023 a-6c96cfe061ff:aa user$ jstat -gcutil 6864 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 93.75 50.27 59.64 97.38 94.67 47 0.762 5 0.858 1.620 S0 — Heap上的 Survivor space 0 区已使用空间的百分比 S1 — Heap上的 Survivor space 1 区已使用空间的百分比 E — Heap上的 Eden space 区已使用空间的百分比 O — Heap上的 Old space 区已使用空间的百分比 P — Perm space 区已使用空间的百分比 YGC — 从应用程序启动到采样时发生 Young GC 的次数 YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) FGC — 从应用程序启动到采样时发生 Full GC 的次数 FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) GCT — 从应用程序启动到采样时用于垃圾回收的总时 jstat -class 6864

成为Java GC专家(5)—Java性能调优原则

南笙酒味 提交于 2019-11-27 12:34:58
这是“ 成为Java GC专家 ”系列的第五篇文章。在第一篇 深入浅出Java垃圾回收机制 中,我们已经学习了不同的GC算法流程、GC的工作原理、新生代(Young Generation)和老年代(Old Generation)的概念。你应该了解了JDK7中5种GC类型以及各种类型对应用程序的影响。 在第二篇 如何监控Java的垃圾回收 中,阐述了 JVM 是怎样实际执行垃圾回收的,我们怎样去监控GC以及哪些工具能让这个过程更高效。 第三篇 如何如何优化Java垃圾回收机制 中展示了一些基于真实案例的最佳实践。同时讲解了怎样尽量少地将对象放入老年代空间(Old Area),避免频繁地执行完全垃圾回收(Full GC)。还说明了如何设置GC的类型和内存大小。 在第四篇 Apache的MaxClients参数详解及其在Tomcat执行FullGC时的影响 中,解释了MaxClients参数的重要性以及它在垃圾回收过程中对整个系统性能的显著影响。 第五篇文章将讲解Java程序性能调优的原则,尤其是在这个过程中必要的知识以及判断你的程序是否需要调优。还会介绍调优过程中你可能遇到的问题。本文最后会给出一些建议,依据这些你能在对Java程序调优时做出更好的决策。 概述 并不是每个程序都需要调优。如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能。然而,在程序调试完成之后

JVM调优前戏之JDK命令行工具---jstack

廉价感情. 提交于 2019-11-27 09:53:00
在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监测JVM运行时的状态,下面我们来详细解读一下几个常用的工具以及如何使用。 jstack jstack(JVM Stack Trace)用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的就是定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程在后台到底做了些什么事情,或者等待着什么资源。 命令格式 jstack [option] LVMID option参数 -F : 当正常输出请求不被响应时,强制输出线程堆栈 -l : 除堆栈外,显示关于锁的附加信息 -m : 如果调用到本地方法的话,可以显示C/C++的堆栈 示例 $ jstack -l 45995 2019-08-14 17:34:36 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode): "Attach Listener" #46 daemon prio=9 os