jvm调优

JVM探秘:垃圾收集器

不想你离开。 提交于 2020-01-07 16:42:16
本系列笔记主要基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》,是这本书的读书笔记。 垃圾收集器 垃圾收集算法是是内存回收的方法论,垃圾收集器是内存回收的具体实现。不同的虚拟机会有不同的垃圾收集器的实现,我们主要讨论的是默认的HotSpot虚拟机,这个虚拟机包含的垃圾收集器如下图; 如上图所示,一共有7种垃圾收集器,如果两个垃圾收集器之间有双箭头连线,则两个垃圾收集器可搭配使用。上面是新生代的收集器,下面是老年代的收集器。每个垃圾收集器都有各自适合的使用场景。 Serial 收集器 Serial 是一个“单线程”的 新生代 收集器,使用 复制 算法,它只会使用一个CPU或者一条收集器线程去完成垃圾收集工作,并且它在垃圾收集时,必须 暂停所有其他的工作线程 ,直到它收集结束。“Stop The World”会在用户不可见的情况下,把用户的工作线程全部停掉,这往往是令人难以接受的。 下图是 Serial/Serial Old 收集器运行示意图: 上图中,新生代是 Serial 收集器采用 复制 算法,老年代是 Serial Old 收集器采用 标记-整理 算法。Serial虽然是一个缺点鲜明的收集器,但它依然是虚拟机在Client模式下的默认收集器,它也有优点,比如简单高效(与其他收集器单线程相比),对于单个CPU来说,Serial由于没有线程交互的开销,效率比较高

JVM探秘:垃圾收集器

前提是你 提交于 2020-01-06 23:15:34
本系列笔记主要基于《深入理解Java虚拟机: JVM 高级特性与最佳实践 第2版》,是这本书的读书笔记。 垃圾收集器 垃圾收集算法是是内存回收的方法论,垃圾收集器是内存回收的具体实现。不同的虚拟机会有不同的垃圾收集器的实现,我们主要讨论的是默认的HotSpot虚拟机,这个虚拟机包含的垃圾收集器如下图; 如上图所示,一共有7种垃圾收集器,如果两个垃圾收集器之间有双箭头连线,则两个垃圾收集器可搭配使用。上面是新生代的收集器,下面是老年代的收集器。每个垃圾收集器都有各自适合的使用场景。 Serial 收集器 Serial 是一个“单线程”的 新生代 收集器,使用 复制 算法,它只会使用一个CPU或者一条收集器线程去完成垃圾收集工作,并且它在垃圾收集时,必须 暂停所有其他的工作线程 ,直到它收集结束。“Stop The World”会在用户不可见的情况下,把用户的工作线程全部停掉,这往往是令人难以接受的。 下图是 Serial/Serial Old 收集器运行示意图: 上图中,新生代是 Serial 收集器采用 复制 算法,老年代是 Serial Old 收集器采用 标记-整理 算法。Serial虽然是一个缺点鲜明的收集器,但它依然是虚拟机在Client模式下的默认收集器,它也有优点,比如简单高效(与其他收集器单线程相比),对于单个CPU来说,Serial由于没有线程交互的开销,效率比较高

JVM 调优 - JPS

空扰寡人 提交于 2020-01-02 05:06:52
Java命令学习系列(一)——Jps 2015-04-16 分类: Java 阅读(23993) 评论(7) 阿里大牛珍藏架构资料,点击链接免费获取 jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种(例如,定制的启动 器)。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。 位置 我们知道,很多Java命令都在jdk的JAVA_HOME/bin/目录下面,jps也不例外,他就在bin目录下,所以,他是java自带的一个命令。 功能 jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。 原理 jdk中的jps命令可以显示当前运行的java进程以及相关参数,它的实现机制如下: java程序在启动以后,会在 java.io.tmpdir 指定的目录下,就是临时文件夹里,生成一个类似于 hsperfdata_User 的文件夹

jvm系列(一)之内存模型

£可爱£侵袭症+ 提交于 2019-12-31 23:02:53
JVM内存结构 Java内存模型是指Java虚拟机的内存模型,我们来看下Java内存模型的图片: VM内存模型主要分为三块:Java 堆内存(Heap)、方法区(Non-Heap)、JMV栈(JVM Stack)、本地方法栈(Native Method Stacks)、程序计数器(Program Counter Register)。 Java堆(Heap) 对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。 根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。 如果在堆中没有内存完成实例分配,并且堆也无法再扩展时

JVM 调优总结

别来无恙 提交于 2019-12-28 20:20:14
一、堆与栈 1、堆是所有对象共享的,存储对象信息; 每一个线程都有一个独立的线程栈,栈存储的是与当前线程相关的信息,包括局部变量、程序运行状态、方法返回值等。 2、堆中存储的是对象,栈中存储的是 基本类型 和 堆中对象的引用 。 3、栈的大小配置 -Xss 4、在运行栈中,基本类型和引用的处理是一样的,都是传值。 5、可以把一个对象看作为一棵树,对象的属性如果还是对象,则还是一棵树(非叶子节点),而基本类型则是叶子节点。 二、Java对象的大小 1、一个空的Object对象: Object obj = new Object(); 其所占的空间为: 8+4 =12 bytes 。其中8 bytes 是Java堆中对象的所需空间,4 bytes是栈中保存引用的所需空间 2、以下类 class NewObject { int count; boolean flag; Object obj; } 其的对象 NewObject newObj = new NewObject(); newObj 所占空间 8 + 4 +1 + 4 = 17 bytes. 其中8 bytes 为 newObj 空对象大小,4 bytes为 int 大小,1 byte为 boolean 大小, 4 bytes为 obj引用大小。 又因为Java对象内存分配以8的整数倍来分,故而对象的大小为 24 bytes。 3

5种JVM调优配置方法概览

痞子三分冷 提交于 2019-12-27 18:20:41
1 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 -XX:MaxPermSize=n:设置持久代大小 2 收集器设置 -XX:+UseSerialGC:设置串行收集器 -XX:+UseParallelGC:设置并行收集器 -XX:+UseParalledlOldGC:设置并行年老代收集器 -XX:+UseConcMarkSweepGC:设置并发收集器 垃圾回收统计信息 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename 3 并行收集器设置 -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。 -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1

深入理解Java虚拟机-Java内存区域透彻分析

我与影子孤独终老i 提交于 2019-12-26 16:09:22
Java虚拟机深入理解 系列全部文章更新中... 深入理解Java虚拟机-Java内存区域透彻分析 深入理解Java虚拟机-常用vm参数分析 深入理解Java虚拟机-JVM内存分配与回收策略原理,从此告别JVM内存分配文盲 深入理解Java虚拟机-如何利用JDK自带的命令行工具监控上百万的高并发的虚拟机性能 深入理解Java虚拟机-如何利用VisualVM对高并发项目进行性能分析 深入理解Java虚拟机-你了解GC算法原理吗 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这些知识之后,才能更好的进行Jvm调优或者更加深入的学习,本来这些知识是晦涩难懂的,所以希望能够讲解的透彻且形象。 0 运行时数据区域 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 Java 虚拟机所管理的内存一共分为Method Area(方法区)、VM Stack(虚拟机栈)、Native Method Stack(本地方法栈)、Heap(堆)、Program Counter Register(程序计数器)五个区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。具体如下图所示: 上图介绍的是JDK1.8 JVM运行时内存数据区域划分。1.8同1.7比

JVM调优之jstack找出最耗cpu的线程并定位代码

北战南征 提交于 2019-12-23 16:03:07
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。 第一步先找出Java进程ID,服务器上的Java应用名称为mrf-center: root@ubuntu:/# ps -ef | grep mrf-center | grep -v grep root 21711 1 1 14:47 pts/3 00:02:10 java -jar mrf-center.jar 得到进程ID为21711,第二步找出该进程内最耗费CPU的线程,可以使用 1)ps -Lfp pid 2)ps -mp pid -o THREAD, tid, time 3)top -Hp pid 用第三个,输出如下: TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用 printf "%x\n" 21742 得到21742的十六进制值为54ee,下面会用到。 OK,下一步终于轮到jstack上场了,它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下: root@ubuntu:/# jstack 21711 | grep 54ee

JVM调优、工具使用与故障分析

柔情痞子 提交于 2019-12-19 03:42:58
一、 JDK运行内存调整: JDK7 -Djdk.tls.ephemeralDHKeySize=2048 -server -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxNewSize=600m -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=6 -XX:+ExplicitGCInvokesConcurrent JDK8 JAVA_OPTS="-Xms1024m -Xmx2048m -Xss1024K -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m" TOMCAT调整(Windows): catalina.bat: SET CATALINA_OPTS=-server -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:MaxNewSize=600m -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=6 -XX:+ExplicitGCInvokesConcurrent TOMCAT调整(Linux): catalina.sh: CATALINA_OPTS="-server

JVM学习总结三——垃圾回收器

China☆狼群 提交于 2019-12-18 05:54:14
整两天再看调优分析的部分,发现实际运行环境下,还是要考虑配置垃圾回收器,所以这里就加一小章介绍一下。 首先来看一下HotSpot所支持回收期的关系图: 图中可以看到一共有7中垃圾回收器,以中间绿线为界,上边三个用于年轻代,下边三个用在年老代,而G1则老少通吃, 黑线 线表示两个回收器可搭配使用, 红线 则表示两者可以在同一区域交替使用。由于G1在JDK1.7才达到商用级别,而且目前线上环境也很少使用,在此不再介绍。下面我们来介绍一下其他六种: Serial: 从名字就能看出是串行的意思,该回收器是最早实现的,基于单线程,实现简单且效率高,但是进行垃圾回收是会造成“Stop-the-World”(STW),当回收内存区域较大时,就会造成程序响应时间变长。 ParNew: 全名Parallel New Generation,也就是并行新生代垃圾回收期,该回收器实现与Serial基本上一样,只是采用多线程执行回收。 Parallel Scavenge: 并行清理,也就是并行垃圾回收器。该回收器与ParNew的最大区别在于ParNew通常与CMS搭配,一般注重于减少垃圾回收的停顿时间,提高响应速度,而 Parallel Scavenge则侧重于吞吐量的控制,又名"吞吐量优先"回收器(吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间);响应时间影响用户体验