【转载】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"

 

时间: 2024-11-03 04:16:12

【转载】JVM内存分配与调优参数列表的相关文章

Linux操作系统调优参数有具体含义

所有的TCP/IP调优参数都位于/proc/sys/net/目录.例如, 下面是最重要的一些调优参数,后面是它们的含义: 1./proc/sys/net/core/rmem_max - 最大的TCP数据接收缓冲 2./proc/sys/net/core/wmem_max - 最大的TCP数据发送缓冲 3./proc/sys/net/ipv4/tcp_timestamps - 时间戳在(请参考RFC 1323)TCP的包头增加12个字节 4./proc/sys/net/ipv4/tcp_sack

Linux系统调优参数知多少?

所有的TCP/IP调优参数都位于/proc/sys/net/目录.例如,下面是最重要的一些调优参数,后面是它们的含义: 1./proc/sys/net/core/rmem_max - 最大的TCP数据接收缓冲 2./proc/sys/net/core/wmem_max - 最大的TCP数据发送缓冲 3./proc/sys/net/ipv4/tcp_timestamps - 时间戳在(请参考RFC 1323)TCP的包头增加12个字节 4./proc/sys/net/ipv4/tcp_sack -

jdk 调优参数在哪设置?????????????~??~~

问题描述 jdk 调优参数在哪设置?????????????~??~~ 比如 -XX:+PrintGCDtails 在哪进行设置,如何优化jvm ????????????????????????????????~ 解决方案 配置文件,比如 C:j2sdk1.4.2_09jrelibi386JVM.cfg 解决方案二: 单纯的调整JDK的参数没有意义吧?只有在运行某个程序的时候为程序设置运行的参数才有意义,比如你在运行某个类时,可以指定一些JVM参数,最常见的是调整内存,再比如运行Eclipse时

最简单例子图解JVM内存分配和回收

原文链接:最简单例子图解JVM内存分配和回收 一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分为Eden区(圣经中的伊甸园).和两个Survivor区.新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区.   简单讲,就是生命期短的对象放在一起

Jvm原理剖析与调优之内存结构

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dba10g.blog.51cto.com/764602/1637276 一些不得不说的概念 JVM JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一个存储方法域. JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟

JVM内存最大能调多大分析【经典】

转载:http://jinyu345.blog.163.com/blog/static/67778922011894254621/ 上次用weblogic 把 -XmxXXXX 设成2G,就启动不起来,设小点就起来了,当时很气,怎么2G都起不了,今天在看到了一篇解释,转过来了这 次一位老友提出了这个问题,记得当年一个java高手在blogjava提出后,被骂得半死.大家使用java -XmxXXXX -version版本得出了不同的结论.后来老友说大概是1800M左右,我当时反驳,"我设置过服务

15个你不知道的mysql性能调优参数介绍

1.DEFAULT_STORAGE_ENGINE 如果你已经在用MySQL 5.6或者5.7,并且你的数据表都是InnoDB,那么表示你已经设置好了.如果没有,确保把你的表转换为InnoDB并且设置default_storage_engine为InnoDB. 为什么?简而言之,因为InnoDB是MySQL(包括Percona Server和MariaDB)最好的存储引擎 – 它支持事务,高并发,有着非常好的性能表现(当配置正确时).这里有详细的版本介绍为什么 2.INNODB_BUFFER_PO

JVM调优

在了解JVM调优之前,我们先了解下java的内存管理:http://blog.csdn.net/cymm_liu/article/details/7759696 基于Java的应用最大的问题莫过于出现Out Of Memory Error(内存溢出错误),通常出现OOME问题的应用都会有以下一些表现: l         Jvm crash l         性能奇差 l         Jvm似乎在不断的进行垃圾回收收集,这通常致使程序停止运行甚至服务崩溃   而且一旦出现这种情况,一般都需

JVM内存配置详解(转)

  前段时间在一个项目的性能测试中又发生了一次OOM(Out of swap sapce),情形和以前网店版的那次差不多,比上次更奇怪的是,此次搞了几天之后啥都没调整系统就自动好了,死活没法再重现之前的OOM了!问题虽然蹊跷,但也趁此机会再次对JVM堆模型.GC垃圾算法等进行了一次系统梳理:  基本概念 堆/Heap JVM管理的内存叫堆:在32Bit操作系统上有4G的限制,一般来说Windows下为2G,而Linux 下为3G:64Bit的就没有这个限制. JVM初始分配的内存由-Xms指定,