Stop The World现象

GC收集器和我们GC调优的目标就是尽可能的减少STW的时间和次数。

内存分配与回收策略

对象优先在Eden分配,如果说Eden内存空间不足,就会发生Minor GC
大对象直接进入老年代,大对象:需要大量连续内存空间的Java对象,比如很长的字符串和大型数组;容易出现的问题:1、导致内存有空间,还是需要提前进行垃圾回收获取连续空间来放他们,2、会进行大量的内存复制。
-XX:PretenureSizeThreshold 参数 ,大于这个数量直接在老年代分配;缺省为0 ,表示绝不会直接分配在老年代。
长期存活的对象将进入老年代,默认15岁,-XX:MaxTenuringThreshold调整
动态对象年龄判定,为了能更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄
空间分配担保:新生代中有大量的对象存活,survivor空间不够,当出现大量对象在MinorGC后仍然存活的情况(最极端的情况就是内存回收后新生代中所有对象都存活),就需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代.只要老年代的连续空间大于新生代对象的总大小或者历次晋升的平均大小,就进行Minor GC,否则FullGC。

新生代配置

新生代大小配置参数的优先级:
高:-XX:NewSize/MaxNewSize
中间 -Xmn (NewSize= MaxNewSize)
低:-XX:NewRatio 表示比例,例如=2,表示 新生代:老年代 = 1:2

-XX:SurvivorRatio 表示Eden和Survivor的比值,
缺省为8 表示 Eden:FromSurvivor:ToSurvivor= 8:1:1


同样的代码情况下:
-Xms20M -Xmx20M -XX:+PrintGCDetails –Xmn2m -XX:SurvivorRatio=2
没有垃圾回收
说明所有的对象全部分配到了老年代。

如果参数为:
-Xms20M -Xmx20M -XX:+PrintGCDetails -Xmn7m -XX:SurvivorRatio=2


发生了垃圾回收;
新生代存了部分数组,老年代也保存了部分数组,发生了晋升现象(动态年龄判定)

-Xms20M -Xmx20M -XX:+PrintGCDetails -Xmn15m -XX:SurvivorRatio=8

新生代可以放下所有的数组
老年代没放

-Xms20M -Xmx20M -XX:+PrintGCDetails -XX:NewRatio=2
NewRatio新生代(Eden + 2*S)与老年代(不包括永久区)的比值;
这里新生代6.6,;老年代13.4

老年代放了9个,新生代放了1个;

也就是新生代放第10个的时候,不够了,发生了空间担保,将原来的9个同龄的放到老年代中。

发生了垃圾回收
出现了空间分配担保,而且发生了FullGC

内存泄漏和内存溢出辨析

内存溢出:实实在在的内存空间不足导致;
内存泄漏:该释放的对象没有释放,多见于自己使用容器保存元素的情况下。

示例代码:

public class Stack {public  Object[] elements;private int size = 0;//指示器,指示当前栈顶的位置private static final int Cap = 16;public Stack() {elements = new Object[Cap];}//入栈public void push(Object e){elements[size] = e;size++;}//出栈public Object pop(){size = size-1;Object o = elements[size];elements[size] = null;  //clear to let GC do its workreturn o;}
}
public class UseStack {public static void main(String[] args) {Stack stack = new Stack();Object o = new Object();System.out.println("o="+o);stack.push(o);Object o1 =  stack.pop();System.out.println("o1="+o1);System.out.println(stack.elements[0]);}
}

JDK为我们提供的工具

jps

列出当前机器上正在运行的虚拟机进程
-p :仅仅显示VM 标示,不显示jar,class, main参数等信息.
-m:输出主函数传入的参数. 下的hello 就是在执行程序时从命令行输入的参数
-l: 输出应用程序主类完整package名称或jar完整名称.
-v: 列出jvm参数, -Xms20m -Xmx50m是启动程序指定的jvm参数



Jinfo可以动态的给程序设置参数(只有现实manageable的可以修改)



jstat

是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:jstat-gc 2764 250 20
常用参数:
-class (类加载器)
-compiler (JIT)
-gc (GC堆状态)
-gccapacity (各区大小)
-gccause (最近一次GC统计和原因)
-gcnew (新区统计)
-gcnewcapacity (新区大小)
-gcold (老区统计)
-gcoldcapacity (老区大小)
-gcpermcapacity (永久区大小)
-gcutil (GC统计汇总)
-printcompilation (HotSpot编译统计)

jinfo

查看和修改虚拟机的参数
jinfo –sysprops 可以查看由System.getProperties()取得的参数
jinfo –flag 未被显式指定的参数的系统默认值
jinfo –flags(注意s)显示虚拟机的参数
jinfo –flag +[参数] 可以增加参数,但是仅限于由java -XX:+PrintFlagsFinal –version查询出来且为manageable的参数


jinfo –flag -[参数] 可以去除参数
Thread.getAllStackTraces();

Jmap

用于生成堆转储快照(一般称为heapdump或dump文件)。jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。和jinfo命令一样,jmap有不少功能在Windows平台下都是受限的,除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项都只能在Linux/Solaris下使用。
jmap -dump:live,format=b,file=heap.bin
Sun JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。

jhat

jhat dump文件名
后屏幕显示“Server is ready.”的提示后,用户在浏览器中键入http://localhost:7000/就可以访问详情

Jstack

:显示当前应用的多个线程的栈信息,可以用来查看死锁。

(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
在代码中可以用java.lang.Thread类的getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成jstack的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。

管理远程进程需要在远程程序的启动参数中增加:
-Djava.rmi.server.hostname=……
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

visualvm

插件中心地址
https://visualvm.github.io

但是注意版本问题,不同的JDK所带的visualvm是不一样的,下载插件时需要下对应的版本。




MAT(MemoryAnalyzer.exe)

专门对堆内存分析,查看内存泄漏,内存消耗的情况。
运行程序中,增加参数:





打开上面的文件

浅堆和深堆

浅堆 :(Shallow Heap)是指一个对象所消耗的内存。例如,在32位系统中,一个对象引用会占据4个字节,一个int类型会占据4个字节,long型变量会占据8个字节,每个对象头需要占用8个字节。

深堆 :这个对象被GC回收后,可以真实释放的内存大小,也就是只能通过对象被直接或间接访问到的所有对象的集合。通俗地说,就是指仅被对象所持有的对象的集合。深堆是指对象的保留集中所有的对象的浅堆大小之和。
举例:对象A引用了C和D,对象B引用了C和E。那么对象A的浅堆大小只是A本身,不含C和D,而A的实际大小为A、C、D三者之和。而A的深堆大小为A与D之和,由于对象C还可以通过对象B访问到,因此不在对象A的深堆范围内。

JVM性能调优3_垃圾收集器与内存分配策略__享学课堂相关推荐

  1. JVM性能调优2_垃圾收集器与内存分配策略__享学课堂

    判断对象的存活 引用计数法: 优点:快,方便,实现简单: 缺点:对象相互引用时,很难判断对象是否该回收. 可达性分析: 这个算法的基本思路就是通过一系列的称为"GC Roots"的 ...

  2. JVM由浅入深系列——详解垃圾收集器与内存分配策略

    文章目录 一.内存分配策略 1.引用计数算法 2.可达性分析算法 3.标记清除算法 4.标记复制算法 5.标记整理算法 二.收集器 1.Serial收集器 2.ParNew收集器 3.Parallel ...

  3. JVM快速调优手册v1.0之三:内存分配策略

    内存分配策略 了解GC其中很重要一点就是了解JVM的内存分配策略:即对象在哪里分配和对象什么时候回收. Java技术体系中所提倡的自动内存管理可以归结于两个部分:给对象分配内存以及回收分配给对象的内存 ...

  4. 深入理解JVM读书笔记二: 垃圾收集器与内存分配策略

    3.2对象已死吗? 3.2.1 引用计数法 给对象添加一个引用计数器,每当有一个地方引用它的地方,计数器值+1:当引用失效,计数器值就减1;任何时候计数器为0,对象就不可能再被引用了. 它很难解决对象 ...

  5. JVM:垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 1.对象已死吗 1).引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就 ...

  6. jvm(3)-垃圾收集器与内存分配策略

    [0]README 0.1)本文部分文字转自:深入理解jvm,旨在学习 垃圾收集器与内存分配策略 的基础知识: [1]垃圾回收概述 1)GC(Garbage Collection)需要完成的3件事情: ...

  7. java eden分配参数,JVM垃圾收集器与内存分配策略,

    垃圾收集器与内存分配策略 对象存活判断 引用计数算法 给对象添加一个计数器,每有一个引用+1,当引用失效-1,若为0则不在被使用. 可达性分析算法 对象是否可到达GC roots 或者说GC root ...

  8. jvm垃圾收集器与内存分配策略

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集器与内存分配策略: 以下参考周志明的<<深入理解jvm高级特性与最佳实践>>. 判断对象是否存 ...

  9. 第三章 垃圾收集器与内存分配策略

    第三章 垃圾收集器与内存分配策略 前言: 3.1 概述 3.2 对象已死? 3.2.1 引用计数算法 3.2.2 可达性分析算法 3.2.3 再谈引用,四种引用类型 3.2.4 生存还是死亡 3.3 ...

最新文章

  1. MongoDB_限制集(Capped)
  2. 关于DiscuzNT 1.0
  3. excel vba 使用mschart_使用VBA时不妨借力Excel催化剂的能力,开发更加轻松便捷
  4. VTK:可视化之BlobbyLogo
  5. OpenGL 重复渲染
  6. maven学习(上)- 基本入门用法
  7. 儿童的身高标准对照表_2020“儿童身高标准”出炉,10岁身高140,你家娃达标吗...
  8. boost::stable_vector简单解析
  9. oracle输出对齐方式,sql*plus 中输出格式控制技巧
  10. 数论知识(2)-------------欧拉函数
  11. Git 客户端管理工具:Git Gui、TortoiseGit、GitHub Desktop
  12. 解决Cannot resolve com.lowagie:itext:2.1.7.js6以及.net.jf.jasperresport下com.lowagie:itext标红的问题
  13. Ubuntu 配置固定IP方法
  14. 关于南京市大学生办理住房补贴的流程示意图
  15. 【线性代数·浅学】(一)行列式——n阶行列式定义,行列式性质,行列式展开定理,拉普拉斯定理,范德蒙德行列式,克拉默法则
  16. php mcrypt blowfish,php加密算法blowfish
  17. 中国Web信息博物馆
  18. Pynput模块的学习与创新,基于python的操作录制脚本
  19. 学生管理系统--【Java+MySQL】--数据库系统概论综合性实验
  20. 毕业论文设置图序号为图1-1,而不是图一-1,同时设置题注方便交叉引用

热门文章

  1. 网页黑白代码将整个网站变为黑白色怎么弄
  2. Python必学基础
  3. python entry高度_Python2.7.3 Tkinter Entry(文本框) 说明
  4. 城南花未开,老程已不在;
  5. 函数式编程如何破坏了我
  6. 一个程序员的晋升之路
  7. 几个javascript框架对比(vue,react,Angular等),如何选择?
  8. ionic 打 android 出现 Current working directory is not a Cordova-based project.
  9. Redis集群模式源码分析
  10. DirectPlay的基本概念