十分钟掌握JVM内存分配、垃圾收集器和常用参数

简介: 十分钟掌握JVM内存分配、垃圾收集器和常用参数

本文是老猿为大家精心整理JVM内存分配、垃圾收集器和常用参数这三方面的知识点,希望大家能熟练掌握好jvm的基础知识点,为成为优秀的程序猿打下坚实的基础。


熟练掌握jvm的基础知识是作为java程序猿必需掌握的,这可以帮助我们:


1.调优jvm配置参数,一定程度减少各种OOM问题

如java.lang.OutOfMemoryError:Java heap space


java.lang.OutOfMemoryError: GCoverhead limit execeeded


java.lang.OutOfMemoryError: PermGenspace


2.编码时提高GC问题的意识,写出高效健壮代码

如对象使用完置null及时GC、慎用System.gc()


尽量不要编写返回大数据集的方法(如大数据量的接口)


慎用大量jvm级别的缓存


3.便于排查故障及性能调优

如代码问题导致频繁full gc带来的性能问题


分析内存方法:heap dump 工具:mat


一.jvm内存分配

1.jvm运行结构(下图)

注:JDK1.3.1版本开始使用HotSpot虚拟机


栈区(vm stack)


由编译器自动分配释放,存放方法的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放内存资源。


本地方法栈(nativemethod stack)


与vm stack基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。


静态区,即方法区(PermSpace)


存放加载的类信息、全局常量、静态变量、是各个线程共享的内存区域,不回收释放。


堆区(Heap)


一般由程序员分配释放,存放由new创建的对象和数组,GC主要操作的对象。


程序计数器


VM执行字节码指令,分支、循环、异常处理、线程恢复等需要


2.jvm内存分配—堆(heap)区分配

分代收集策略下的堆(heap)区内存分配


Java堆分为新生代(young区)、老年代(old区)和永久代(Permanent区),新生代(young区)分为伊甸(eden)区和幸存区0(S0)和幸存区1(S1)。


GC有两种类型:ScavengeGC和Full GC。


ScavengeGC对young区的回收,Eden区被写满后触发;


FullGC对整个堆进行整理回收,一般old区被写满后触发;


Scavenge GC也简称YGC,FullGC简称FGC,FGC时要锁内存,FGC太频繁会大大影响性能。


young区垃圾回收原理:


Eden:对象只管申请空间,是新new对象的乐园。在空间满的时候,会进行大屠杀(Scavenge GC)


S区:幸存区,在对Eden屠杀时,会把仍然存活的对象拷贝到幸存区。幸存区存在对等的两个区间,对于一次Scavenge


GC,其中一个为From区,一个为To区。含义为Eden和From的幸存者被拷贝到To区,To区会作为下一次GC的From区


Old: Eden和S区是新生代(young区)的一部分,相对地,在幸存区经历N次,屠杀后仍然存活的话,会被拷贝到old区,进入old区后,ScavengeGC将不在检查对象有效性,需要触发FullGC来回收对象(详见下图)。


二.垃圾收集器

7种收集器,分为两块,上面为新生代收集器,下面是老年代收集器,存在连线两个收集器可以搭配使用,总的来讲分为:串行收集器、并行收集器、并发收集器。


Ø新生代的收集器,都使用复制算法。

1.Serial(串行GC)收集器


单线程执行,执行时必须暂停其他所有的用户线程,是Jvm client模式下默认收集器


2.ParNew(并行GC)收集器


是serial收集器的多线程版本


3.ParallelScavenge(并行回收GC)收集器


多线程并行执行。它的目标则是达到一个可控制的吞吐量。吞吐量=程序运行时间/(程序运行时间+垃圾收集时间),如虚拟机总共运行了100分钟。其中垃圾收集花掉1分钟,吞吐量则99%。


Ø老年代的收集器,使用“标记-清除”或“标记-整理”算法。

1.CMS(并发GC)收集器


一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现


2.Serial Old(串行GC)收集器


是Serial收集器的老年代版本,单线程执行,使用“标记-整理”算法。


3.ParallelOld(并行GC)收集器


是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。


4.G1收集器


JDK1.7提供的一个新收集器,基于“标记-整理”算法实现,收集范围整个Java堆(包括新生代,老年代)。


ØClient、Server模式默认收集器

如果性能要求特别高建议配置使用CMS(并发GC)收集器。


部署jvm基本都使用server模式

三.jvm常用参数设置

Øjvm参数配置示例

附:查看jvm GC情况示例


用java自带的工具jstat命令查看


命令格式:


jstat [Options] vmid [interval][count]


参数说明:


Options,选项,我们一般使用-gcutil查看gc情况


vmid,VM的进程号,即当前运行的java进程号


interval,间隔时间,单位为秒或者毫秒


count,打印次数,如果缺省则打印无数次


如查看jvm gc的简单信息


jstat -gcutil 31479 500


即会每500毫秒一次显示进程号为31479的java进程的GC情况,如下图:

————————————————

文/老猿,写代码写诗写职场的程序猿大叔,倾力原创简单实用的硬干货,转载此文请联系老猿。



相关文章
|
29天前
|
算法 安全 Java
Java内存管理:深入理解垃圾收集器
在Java的世界里,内存管理是一块基石,它支撑着应用程序的稳定运行。本文将带你走进Java的垃圾收集器(GC),探索它是如何默默守护着我们的内存安全。我们将从垃圾收集的基本概念出发,逐步深入到不同垃圾收集器的工作机制,并通过实例分析它们在实际应用中的表现。文章不仅旨在提升你对Java内存管理的认识,更希望你能通过这些知识优化你的代码,让程序运行更加高效。
39 3
|
2月前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
2月前
|
Kubernetes Cloud Native Java
云原生之旅:从容器到微服务的演进之路Java 内存管理:垃圾收集器与性能调优
【8月更文挑战第30天】在数字化时代的浪潮中,企业如何乘风破浪?云原生技术提供了一个强有力的桨。本文将带你从容器技术的基石出发,探索微服务架构的奥秘,最终实现在云端自由翱翔的梦想。我们将一起见证代码如何转化为业务的翅膀,让你的应用在云海中高飞。
|
5天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
14 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
12天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
2月前
|
Python
Python变量的作用域_参数类型_传递过程内存分析
理解Python中的变量作用域、参数类型和参数传递过程,对于编写高效和健壮的代码至关重要。正确的应用这些概念,有助于避免程序中的错误和内存泄漏。通过实践和经验积累,可以更好地理解Python的内存模型,并编写出更优质的代码。
18 2
|
2月前
|
存储 算法 Java
JVM组成结构详解:类加载、运行时数据区、执行引擎与垃圾收集器的协同工作
【8月更文挑战第25天】Java虚拟机(JVM)是Java平台的核心,它使Java程序能在任何支持JVM的平台上运行。JVM包含复杂的结构,如类加载子系统、运行时数据区、执行引擎、本地库接口和垃圾收集器。例如,当运行含有第三方库的程序时,类加载子系统会加载必要的.class文件;运行时数据区管理程序数据,如对象实例存储在堆中;执行引擎执行字节码;本地库接口允许Java调用本地应用程序;垃圾收集器则负责清理不再使用的对象,防止内存泄漏。这些组件协同工作,确保了Java程序的高效运行。
19 3
|
2月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
2月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
133 0
|
2月前
|
C# UED 开发者
WPF打印功能实现秘籍:从页面到纸张,带你玩转WPF打印技术大揭秘!
【8月更文挑战第31天】在WPF应用开发中,打印功能至关重要,不仅能提升用户体验,还增强了应用的实用性。本文介绍WPF打印的基础概念与实现方法,涵盖页面元素打印、打印机设置及打印预览。通过具体案例,展示了如何利用`PrintDialog`和`PrintDocument`控件添加打印支持,并使用`PrinterSettings`类进行配置,最后通过`PrintPreviewWindow`实现打印预览功能。
97 0