【转载】JVM内存分配与调优参数列表

简介:

本文转载自http://shift-alt-ctrl.iteye.com/blog/1842631

 

一.运行时数据区:

 

  1. 程序计数器:它是一块较小的内存空间,主要作用是当前线程所执行的字节码的行号指示器.由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间的方式来实现的(协作式/抢占式?!),即任何时刻,任一CPU只会正在处理一个线程的指令;为了确保线程切换后能够正确恢复执行的位置,每个线程都有一个独立的程序计数器,每个计数器为线程私有.如果线程正在执行java方法,那么此计数器记录的是正在执行的字节码指令地址;如果执行的是Native方法,那么它(计数器)的值则为undefined.
  2. 虚拟机栈:线程私有,每个线程在执行java方法时都会被创建虚拟机栈,它用来存储方法执行期间的局部变量/操作数栈/动态连接表等.直到方法退出.局部变量表存放了编译期可知的各种基本类型(boolean,int,char...)以及对象引用类型(reference).如果线程请求的栈深度大于JVM所允许的深度,将会抛出statckOverflowError.
  3. 本地方法栈:对于native方法调用期间,jvm为线程创建的空间.在hotspot中,本地方法栈和虚拟机栈合二为一.
  4. 堆:JVM规范中阐述,所有的对象都将被存储在堆中;堆有可以根据对象的生命周期和收集策略,分为新生代和旧生代;其中新生代中为了便于GC和性能优化,再次分为Eden,from/to交换区三个小区.
  5. 方法区:通常称为持久带,此区为线程共享区域;用于存储VM加载的类信息/常量/静态变量等,它作为堆的逻辑部分,但在GC和空间使用上和堆有着很大的不同.方法区一般很少会被GC,但是方法区中的常量池以及类引用的卸载,仍然会被GC;当方法区空间不足时,仍会抛出OOM异常.
  6. 运行时常量池:作为方法区的一部分,用于编译期生成的各种字面量和符号引用,它具有动态性,即在运行时仍然可以讲常量添加到常量池中,例如String.intern()方法.常量池会被GC.
  7. 直接内存(Directed Menory):通常发生在NIO中为了提升性能,将生命周期较长的buffer声明为直接内存,直接内存不会受到heap区域大小的限制(--Xms,--Xmx参数对其无效),直接内存的大小受到本机物理内存和OS-swap区域大小的限制,如果无法申请到直接内存,JVM也将抛出OOM异常.

    JVM采取了"直接内存指针"方式来访问对象,即本地变量表中维护的对象reference直接指向对象数据的内存地址,在此对象数据中包含了此对象类型的引用(Class),此方式对于操作对象更加快捷.

 

二.JVM常用调优/调试参数:

 

-Xms<size>

例如:-Xms2G,设置Heap的初始大小

-Xmx<size>

设置Heap的最大尺寸,建议为最大物理内存的1/3(建议此值不超过12G)

-Xss<size>

方法栈大小

-Xmn<size>

新生代大小

-XX:NewSize=<value>

-XX:MaxNewSize=<value>

-XX:SurvivorRatio=<value>

新生代设置.单位为byte

SurvivorRatio = Eden/survivor;例如此值为3,则表示,Eden : from : to = 3:1:1;默认值为8

-XX:PermSize=<value>

-XX:MaxPermSize=<value>

方法区大小,max值默认为64M

-XX:[+ | -]UseConcMarkSweepGC

打开或关闭基于ParNew + CMS + SerialOld的收集器组合.(-XX:+UseParNewGC)

-XX:[+ | -]UseParallelGC

在server模式下的默认值(+),表示使用Parallel Scavenge + Serial Old收集器组合

-XX:[+ | -]UseParallelOldGC

默认关闭,+表示打开/使用Parallel Scavenge + Parallel Old收集器组合

-XX:PretenureSizeThreshold=<value>

直接晋升为旧生代的对象大小.大于此值的将会直接被分配到旧生代,单位byte

-XX:MaxTenuringThreshold=<value>

晋升到旧生代的对象年龄(已经或者即将被回收的次数);每个对象被minor GC一次,它的年龄+1,如果对象的年龄达到此值,将会进入旧生代.

-XX:[+ | -]UseAdaptiveSizePolicy

默认开启;是否动态调整java中堆中各个区域大小以及进入旧生代的年龄;此参数可以方便我们对参数调优,找到最终适合配置的参数.

-XX:[+ | -]HandlePromotionFailure

JDK1.6默认开启,是否支持内存分配失败担保策略;在发生Minor GC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则改为直接进行一次Full GC。如果小于,则查看HandlePromotionFailure设置是否允许担保失败;如果允许,那只会进行Minor GC;如果不允许,则也要改为进行一次Full GC。

-XX:ParallelGCThreads=<value>

并行GC时所使用的线程个数.建议保持默认值(和CPU个数有换算关系).

-XX:GCTimeRatio=<value>

GC占JVM服务总时间比.默认为99,即允许1%的GC时间消耗.此参数只在Parallel Scavenge收集器下生效

-XX:CMSInitiatingOccupancyFraction=<value>

设置CMS收集器在旧生代空间适用占比达到此值时,触发GC.

-XX:[+ | -]UseCMSCompactAtFullCollection

默认开启,表示在CMS收集器进行一次Full gc后是否进行一次内存碎片整理,[原因:CMS回收器会带来内存碎片]

-XX:CMSFullGCSBeforeCompaction=<value>

进行多少次FullGC之后,进行一次内存碎片整理.[原因:CMS回收器会带来内存碎片]

 

参考样例:

JAVA_OPTS = "-verbose:gc 

-Xms3G -Xmx=3G 

-XX:MaxPermSize=256M 

-XX:SurvivorRatio=3 

-XX:MaxNewSize=1G 

-XX:+UseConcMarkSweepGC 

-XX:MaxTenuringThreshold=5 

-XX:CMSInitiatingOccupancyFraction=70 

-XX:+UseCMSCompactAtFullCollection

-XX:+PrintGCDetails 

-XX:+PrintGCDateStamps 

-Xloggc:../logs/server-gc.log.$(date +%Y%m%d%H%M) 

-XX:+UseGCLogFileRotation 

-XX:NumberOfGCLogFiles=1 

-XX:GCLogFileSize=512M"

 
目录
相关文章
|
7月前
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
680 55
|
8月前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
668 6
|
7月前
|
消息中间件 运维 监控
加一个JVM参数,让系统可用率从95%提高到99.995%
本文针对一个高并发(10W+ QPS)、低延迟(毫秒级返回)的系统因内存索引切换导致的不稳定问题,深入分析并优化了JVM参数配置。通过定位问题根源为GC压力大,尝试了多种优化手段:调整MaxTenuringThreshold、InitialTenuringThreshold、AlwaysTenure等参数让索引尽早晋升到老年代;探索PretenureSizeThreshold和G1HeapRegionSize实现索引直接分配到老年代;加速索引复制过程以及升级至JDK11使用ZGC。
648 82
加一个JVM参数,让系统可用率从95%提高到99.995%
|
9月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
406 29
JVM简介—1.Java内存区域
|
9月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
9月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】崖山有哪些内存参数,Share Pool各个参数之间有什么关系
【YashanDB知识库】崖山有哪些内存参数,Share Pool各个参数之间有什么关系
【YashanDB知识库】崖山有哪些内存参数,Share Pool各个参数之间有什么关系
|
10月前
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
153 6
|
10月前
|
SQL Oracle 关系型数据库
【YashanDB 知识库】崖山有哪些内存参数,Share Pool 各个参数之间有什么关系
在使用YashanDB时,用户常对内存参数配置有疑问,尤其是23.2及以上版本中,如SQL_POOL_SIZE+DICTIONARY_CACHE_SIZE超100报错,影响跑批性能。主要内存参数包括SHARE_POOL_SIZE、SQL_POOL_SIZE、DICTIONARY_CACHE_SIZE等,需合理配置以优化性能。SHARE POOL内含多个POOL,可动态调整。具体配置方法及观察使用情况的方式详见官网文档。
|
监控 Java 编译器
Java虚拟机调优指南####
本文深入探讨了Java虚拟机(JVM)调优的精髓,从内存管理、垃圾回收到性能监控等多个维度出发,为开发者提供了一系列实用的调优策略。通过优化配置与参数调整,旨在帮助读者提升Java应用的运行效率和稳定性,确保其在高并发、大数据量场景下依然能够保持高效运作。 ####
302 58
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####