jvm学习笔记(三)

文章目录

  • jvm学习笔记(三)
    • 1.全部笔记链接
    • 2.堆
      • 2.1堆的划分
        • 使用JVM参数查看划分
        • Hotspot堆内存划分图(JDK8之前)
      • 2.2 GC对堆的回收
        • GC的种类
        • MinorGC的过程
        • MajorGC的过程(Old GC)
        • Full GC
      • 2.3 一些调节参数
    • 3. OOM
      • 3.1 简介
      • 3.2 排错

1.全部笔记链接

JVM学习笔记(一)
JVM学习笔记(二)
JVM学习笔记(三)
JVM学习笔记(四)

(待更新…)

2.堆

是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行

垃圾收集的最重要的内存区域。由于现代 VM 采用分代收集算法, 因此 Java 堆从 GC 的角度还可以

细分为: 新生代(Eden 区From Survivor 区To Survivor 区)和老年代。

2.1堆的划分

关于堆的划分,需要明确一点:

  • 逻辑上堆是包含新生代,老年代和永久代(JDK1.8叫元空间)
  • 物理上应该是:新生代+老年代,在JDK1.8后,永久代变成了元空间,并且元空间被移到本地内存,而不再虚拟机内存中。
使用JVM参数查看划分
-Xms1024m -Xmx1024m -XX:+PrintGCDetails

一般查看PrintGCDetails都会带上PermGen区(永久代),虽然可以查看打印信息中有Young Generation,Old Generation,PermGen(或者Metaspace),当是计算的时候会发现Heap=Young Generation+Old Generation

永久代:(方法区,不属于java堆,另一个别名为“非堆Non-Heap”)

Hotspot堆内存划分图(JDK8之前)

Heap划分为:

  • Young Generation(占1/3)
  • Old Generation(占2/3)

Young Generation又划分为:

  • Eden Space(伊甸园,占8/10)
  • From Space(幸存区1,占1/10)
  • To Space(幸存区2,占1/10)

From Space和To Space是两个幸存区,而这两个区域并非一成不变,这两个区域在GC的过程会进行交换。

2.2 GC对堆的回收

GC的种类

GC用来回收堆中不再使用的对象,GC分两种:

  • MinorGC(轻GC)
  • MajorGC (重GC)

一般情况下,会触发MinorGC,MajorGC 不会频繁执行。

之前看复习资料以为GC单纯两种,后来发现还要其他GC模式,然后上网查阅了相关资料,然后得出以下结论:

以下内容来自知乎: https://www.zhihu.com/question/41922036

针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:

  • Partial GC:并不收集整个GC堆的模式

    • Young GC:只收集young gen的GC
    • Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式
    • Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式
  • Full GC:收集整个堆,包括young gen、old gen、perm gen(如果存在的话)等所有部分的模式。

Major GC通常是跟full GC是等价的,收集整个GC堆。但因为HotSpot VM发展了这么多年,外界对各种名词的解读已经完全混乱了,当有人说“major GC”的时候一定要问清楚他想要指的是上面的full GC还是old GC。

作者:RednaxelaFX
链接:https://www.zhihu.com/question/41922036/answer/93079526
来源:知乎

MinorGC的过程

由于频繁创建对象,所以新生代会频繁触发MinorGC 进行垃圾回收。当 Eden 区内存不够的时候就会触发 MinorGC,对新生代区进行一次垃圾回收。MinorGC使用的是复制算法,过程如下:

  1. MinorGC会把Eden Space+From Space扫描一边
  2. 扫描过后将存活的对象复制到 To Space 区域,并对对象的年龄进行+1
  3. 然后清空Eden Space+From Space的对象
  4. 最后,将To Space和From Space标志互换(不移动对象,区域的标志更换,就是To变成From),To Space等待下次MinorGC的回收。
MajorGC的过程(Old GC)

老年代的对象比较稳定,所以 MajorGC 不会频繁执行。大部分对象会在MinorGC过程中消亡,而一般只有部分的能进入老年代。在进行 MajorGC 前一般都先进行了一次 MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。MajorGC 通常采用标记清除算法或标记整理算法(其实也不能说MajorGC就是标记清除算法,使用哪种算法对老年代进行垃圾回收完全取决于使用的那种垃圾回收器),垃圾回收器将在其他学习笔记中的介绍,现在先说一下标记清除算法,标记清除算法过程如下:

  • 首先扫描一次所有老年代,标记出存活的对象。
  • 然后回收没有标记的对象。
Full GC

当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。

作者:RednaxelaFX
链接:https://www.zhihu.com/question/41922036/answer/93079526

2.3 一些调节参数

调节堆

#调节大小
-Xmx -Xms
#控制Eden和Survivor的比例
-XX:SurvivorRatio
#调节Young和Old的比例
-XX:NewRatio
#调节永久代初始大小(JDK1.8不用了)
-XX:PermSize
#调节永久代大小最大值
-XX:MaxPermSize

垃圾回收的一些参数

#垃圾最大年龄
-XX:MaxTenuringThreshold

3. OOM

3.1 简介

OOM,全称“Out Of Memory”,源于java.lang.OutOfMemoryError。当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error。

3.2 排错

内存快照分析工具,MAT,Jprofiler。作用分析Dump内存文件,快速定位内存泄漏。

输出Dump文件

#内存泄漏时输出dump文件
-XX:HeapDumpOnOutOfMemoryError
#重GC前输出dump文件
-XX:+HeapDumpBeforeFullGC
#指定dump文件目录
-XX:HeapDumpPath=xxx

输出Dump文件**

#内存泄漏时输出dump文件
-XX:HeapDumpOnOutOfMemoryError
#重GC前输出dump文件
-XX:+HeapDumpBeforeFullGC
#指定dump文件目录
-XX:HeapDumpPath=xxx

dump出来的内存文件,用Jprofiler可以查看到其内存分配情况,并且通过线程快照 可以查看到在哪一行代码导致内存泄漏。

jvm学习笔记(三)相关推荐

  1. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

  2. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  3. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  4. JVM学习笔记(四)

    JVM学习笔记(四) 文章目录 JVM学习笔记(四) 笔记链接 1.GC算法 1.1GC-判断对象是否可回收 1.1.1 引用计数法 1.1.1 可达性分析 1.2GC-回收算法 标记清除法(Mark ...

  5. jvm学习笔记(二)

    jvm学习笔记(二) 文章目录 jvm学习笔记(二) 1.全部笔记链接 2. Native关键字 3.关于JVM规范 3.1 JVM规范中运行时数据区的概念 4.HotSpot的JVM运行时数据区 4 ...

  6. jvm学习笔记(一)

    jvm学习笔记(一) 文章目录 jvm学习笔记(一) 1.全部笔记链接 3.类加载器 作用 类别 加载步骤 获得类加载器 4.双亲委派机制 5.沙箱安全机制 沙箱概念 JAVA沙箱的基本组件 基本组件 ...

  7. JVM学习笔记-01-JVM的学习方式

    JVM学习笔记-01-JVM的学习方式 文章目录 JVM学习笔记-01-JVM的学习方式 JVM探究 最新JVM教程IDEA版[Java面试速补篇]-01-JVM的学习方式 JVM探究 请你谈谈对JV ...

  8. 【JVM 学习笔记 05】:JVM性能调优工具的使用和优化案例

    [JVM 学习笔记 05]:JVM性能调优工具的使用 1. 使用 jstat(命令行工具) 查看线上系统的JVM运行状况 1.1 常用命令 1.2 使用技巧 1.2.1 随着系统运行,每秒钟会在年轻代 ...

  9. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

最新文章

  1. 永远不要对 AI 说:“我不行!”
  2. Spring+Shiro+CAS整合配置笔记
  3. 掘金Markdown使用
  4. 机房收费--操作员注册
  5. Android 单击+双击+短按+长按 逻辑
  6. linux mysql主从配置_linux下mysql主从配置
  7. vuex mutations_Vuex 的基本知识总结
  8. cesium 圆形波动
  9. 计算机设计大赛无人车挑战赛
  10. css3 实现图片旋转
  11. PAIP.ASP.NET FTP SKIPLIST
  12. Linux界面介绍及基础知识
  13. 简单的VB进度条程序
  14. 施耐德变频器与昆仑通态触摸屏Modbus通讯程序实现正转反转,启停复位,频率设定等功能
  15. Office在线协作(一)- 在本地服务器上安装ONLYOFFICE Docs Community Edition For Windows Server - 超详细安装教程
  16. 我99年想出来00年发表的一个概念,被百度百科引用了
  17. 计算机中安装音乐软件是一种,电脑必装的八款软件,你装了吗?
  18. 释放租赁红利,中国长租公寓行业创新模式探讨和分析
  19. 名帖317 沈尹默 行书《春蚕词》
  20. 杰理之使用 mic_rec_play_start()测试 mic 无声的解决方法【篇】

热门文章

  1. Scalaz(27)- Inference Unapply :类型的推导和匹配
  2. SQL Server插入中文数据后出现乱码
  3. 【iHMI43 应用演示】之 modbus 协议(从机)通信演示
  4. 路由器启动后如何定位IOS?
  5. List, Stack, and Queue
  6. 一个***与一个电脑白痴的经典对白
  7. python中count()方法
  8. JS获取元素在页面的位置
  9. ASP.Net中关于WebAPI与Ajax进行跨域数据交互时Cookies数据的传递
  10. Spring中基于Java的配置@Configuration和@Bean用法