热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《JVM故障诊断指南》之1

原文链接原文作者:ByronKiourtzoglou翻译:梅小西(904516706)OracleHotSpotJVM内存JavaHotSpot虚拟机堆空间这个部分将向你介绍Ora

原文链接 原文作者:Byron Kiourtzoglou 翻译:梅小西(904516706)

Oracle HotSpot JVM 内存

Java HotSpot 虚拟机堆空间

这个部分将向你介绍Oracle Java HotSpot虚拟机里不同的Java堆内存空间概览。理解这个对于任何一个涉及到线上经常出现的内存问题的解决非常重要。而具有合适的Java 虚拟机堆空间的知识是很关键的。

Java虚拟机是你Java程序的基础,它提供了动态内存管理服务,垃圾收集,线程,IO以及本地操作等等。

Java堆空间是运行时Java程序的内存“容器”,它为你的Java程序提供了它需要的(Java堆,本地堆)合适的内存空间,并由JVM自身管理。

JVM HotSpot内存被分为3个内存空间:
• The Java Heap(堆)
• The PermGen (持久代)
• 本地堆(C-堆)

下面是他们的详细分类:

内存空间 启动参数和调整方法 监控方式 描述
Java 堆 -Xmx (最大堆容量)
-Xms (最小堆容量)

EX:
-Xmx1024m
-Xms1024m-verbose GC
– JMX API
– JConsole
– 其他监控工具Java堆是存储你的主要
的Java程序Class实例。持久代-XX:MaxPermSize (最大容量)
-XX:PermSize (最小容量)

EX:
-XX:MaxPermSize=512m
-XX:PermSize=256m- verbose GC
– JMX API
– JConsole
– 其他监控工具Java HotSpot虚拟机持久代空间
是一种JVM存储,主要用于存储
Class对象,如类名 ,类方法,
内部JVM对象和其他JIT优化
相关的数据。本地堆(C-堆)不支持直接配置。

对于32位的虚拟机,
C堆容量= 4 Gig –堆 – 持久代

对于64位的虚拟机,C堆容量=
服务器总物理内存
&虚拟内存-堆-持久代- 在Windows 和Linux上检查
整个进程大小
– Solaris 和Linux 下用pmap命令行
– AIX上用svmon命令C堆保存各种对象如MMAP文件,
其他JVM和第三方本地代码对象。
Java堆空间 – 概览 & 生命周期

你的Java程序生命周期通常看起来像这样:
• Java 程序编码(via Eclipse IDE etc.) ,例如 HelloWorld.java
• Java 程序编译 (Java 编译器或者第三方编译工具如Apache Ant, Apache Maven..),例如 HelloWord.class
• Java 程序启动和运行,例如通过HelloWorld.main() 方法运行。

现在我们来分析你的HelloWorld.class 程序,这样你能更好理解。
• 启动时,JVM会加载并把一些你的静态程序以及JDK库缓存到本地堆里面,包括本地库,映射文件比如你的程序Jar文件,线程比如你的程序的主启动线程等。
• JVM此时会保存你的HelloWorld.class的“静态”数据到持久代空间(Class元数据,描述信息等)
• 一旦你的程序启动,JVM开始管理,并在Java堆里为程序动态的分配内存(年轻代和老年代),这也是为什么了解你的程序需要多大内存空间是如此重要,你可以通过-Xms & -Xmx 的JVM参数恰当的调整你的Java堆大小。通过性能分析,堆转储分析允许你来决定程序的内存占用。
• 最终,当你的程序不再需要内存时,JVM也会动态的从堆里释放内存,这叫垃圾收集。这个过程通过JVM verbose GC或者一个监控工具比如Jconsole能很容易的监控到。

Java HotSpot 虚拟机持久代

Java HotSpot虚拟机持久代是JVM用来存储你的Java程序Class对象。Java堆主要用来保存实际的短期或者长期的持久代Class对象实例。

持久代本身是完全静态的,除非用第三方工具或者动态类加载中经常用到的Java反射API。

有一点很重要需要注意,这种内存存储方式只应用在Java Hotspot虚拟机上,其他的JVM比如IBM 和Oracle JRockit是没有这种固定以及可配置的持久代存储,它是用其他技术去管理非堆内存(本地内存)。

找到下面一张图,它描述了JVM HotSpot Java堆 vs 持久代 并分析他们各自关联的的属性和容量参数调整。


这里写图片描述

除了Oracle HotSpot JVM,还有其他各种供应商提供的虚拟机。接下来的部分我们将分析其他JVM的内存配置。理解HotSpot和其他虚拟机在实现和命名约定的不同也很重要。

IBM JVM 内存

IBM 虚拟机 内存分为2个区域:
• Java堆 Heap (年轻空间和年老空间)
• 本地堆(C-Heap)

这是他们的分析:

 

内存空间 启动参数和调整方法 监控方式 描述
Java 堆 -Xmx (最大堆容量)
-Xms (最小堆容量)
– verbose GC
– JMX API
– IBM 监控工具

EX:
-Xmx1024m
-Xms1024m

GC 策略Ex:
-Xgcpolicy:gencon
(使gencon GC 策略生效)

-verbose GC
– JMX API
– IBM监控工具IBM Java 堆通常分为年轻代和
年老代(YoungGen, OldGen).

年轻代 GC 策略 (联合了并发和分代GC)
通常用于Java EE 平台,为了最小化
GC暂停时间。本地堆 (C堆)不支持直接配置
对于32位虚拟机,C堆容量
= 4 Gig – Java堆

对于64位虚拟机,C堆容量 =
物理服务器总内存 & 虚拟内存
– Java堆

– svmon 命令C堆用来保存class元数据
对象,包括库文件,其他
JVM以及第三方本地代码对象。
也许你也注意到,IBM的虚拟机是没有持久代的。持久代仅用于HotSpot虚拟机。IBM虚拟机是用本地堆保存相关数据的Class元数据。
Oracle也开始打算将持久代从HotSpot里去掉,我们在接下来的部分会讨论。

Oracle JRockit JVM 内存

JRockit 虚拟机内存分为2个部分:
• Java堆(年轻代和老年代)
• 本地内存空间(Class池,C堆,线程…)

 

内存空间 启动参数和调整方法 监控方式 描述
Java 堆 -Xmx (最大堆容量)
-Xms (最小堆容量)

EX:
-Xmx1024m
-Xms1024m-verbose GC
– JMX API
– JRockit Mission
Control 工具集

JRockit Java堆通常分为年轻代
(短寿命对象)和年老代(长生命周期对象)。

本地内存空间不支持直接配置。

对32位虚拟机,本地内存空间容量
= 2-4 Gig – Java堆

** 依据你操作系统的不同,进程
大小限制 2 GB, 3 GB 或 4 GB
**

对64位虚拟机,本地内存空间容量
= 物理机总内存 &虚拟内存– Java堆

– 在Windows和Linux上
检查总进程大小

– Solaris & Linux 的
pmap 命令行

– JRockit JRCMD 工具

JRockit本地内存空间用
于存储Class元数据,线程
以及各种对象如库文件,
其他JVM和第三方本地代码对象。
和IBM虚拟机类似,JRockit也没有持久代,它使用本地堆存储相关对的Class元数据。

JRockit倾向于用更多的本地内存达到更好的性能。它没有解释模式,只有编译模式,由于它多了本地内存,和同等大小的Sun JVM相比,进程需要的大小通常会大好几百M 。但这不是一个大问题,除非你使用32位的JRockit并加上很大堆空间。这种方式下,对于JRockit(对于32位虚拟机来说,堆越大留个本地堆的就越小)来说,OutOfMemoryError的危险性归咎于本地堆消耗过高 。

HotSpot和JRockit的提供商Oracle的策略,是将这2个虚拟机合成一个,并且包含2个的优点和特性。这也使得JVM调优变得简单,因为未能理解这2个虚拟机的不同会导致错误的调优建议和性能问题。

译者介绍:
梅小西
Java工程师,关注JVM,并发编程,喜欢研究Python,Scala,Golang等。

译者相关译文:
JVM内部原理
《JVM故障诊断指南》之1 ——JVM概览与介绍
《JVM故障诊断指南》之2 ——调整合适的Java堆大小的技巧
《JVM故障诊断指南》之3 ——Java 线程: JVM持有内存的分析
《JVM故障诊断指南》之4 ——Java 8:从持久代到metaspace


推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
author-avatar
手机用户2502929967
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有