JVM内存区域参数配置

转自:https://www.jianshu.com/p/5946c0a414b5

需要提前了解的知识点:

  1. JVM内存模型
  2. JVM垃圾回收算法

下图是JVM内存区域划分的逻辑图

JVM内存区域逻辑图

从图中我们大概了解JVM相关的内存区域。

JVM内存包括区域

  1. Heap(堆区)
  • New Generation(新生代)

    • Eden
    • Survivor From
    • Survivor To
  • Old Generation(老年代)
  1. 方法区
  • Permanent Generation(持久代)
  1. Stack(栈区)
  2. Metaspace(元空间)
  3. Direct ByteBuffer(直接内存)

下面我们就通过一些JVM启动参数来配置以上内存空间

Heap(堆)内存大小设置

-Xms512m

设置JVM堆初始内存为512M

-Xmx1g

设置JVM堆最大可用内存为1G

New Generation(新生代)内存大小设置

-Xmn256m

设置JVM的新生代内存大小(-Xmn 是将NewSize与MaxNewSize设为一致。256m),同下面两个参数

-XX:NewSize=256m

-XX:MaxNewSize=256m

还可以通过新生代和老年代内存的比值来设置新生代大小

-XX:NewRatio=3

设置新生代(包括Eden和两个Survivor区)与老年代的比值(除去持久代)。设置为3,则新生代与老年代所占比值为1:3,新生代占整个堆栈的1/4

Survivor内存大小设置

-XX:SurvivorRatio=8

设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个新生代的1/10

Eden内存大小设置

新生代减去2*Survivor的内存大小就是Eden的大小。

Old Generation(老年的)的内存大小设置

堆内存减去新生代内存

如上面设置的参数举例如下:

老年代初始内存为:512M-256M=256M

老年代最大内存为:1G-256M=768M

Stack(栈)内存大小设置

-Xss1m

每个线程都会产生一个栈。在相同物理内存下,减小这个值能生成更多的线程。如果这个值太小会影响方法调用的深度。

Permanent Generation(持久代)内存大小设置

方法区内存分配(JDK8以前的版本使用,JDK8以后没有持久代了,使用的MetaSpace)

-XX: PermSize=128m 设置持久代初始内存大小128M

-XX:MaxPermSize=512m 设置持久代最大内存大小512M

Metaspace(元空间)内存大小设置

元空间(Metaspace)(JDK8)

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m(JDK8),JDK8的持久代几乎可用完机器的所有内存,同样设一个128M的初始值,512M的最大值保护一下。

  1. 默认情况下,类元数据分配受到可用的本机内存容量的限制(容量依然取决于你使用32位JVM还是64位操作系统的虚拟内存的可用性)。
  1. 一个新的参数 (MaxMetaspaceSize)可以使用。允许你来限制用于类元数据的本地内存。如果没有特别指定,元空间将会根据应用程序在运行时的需求动态设置大小。

Direct ByteBuffer(直接内存)内存大小设置

-XX:MaxDirectMemorySize

此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后,即触发Full GC。注意该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory(),在程序中中可以获得-XX:MaxDirectMemorySize的设置的值。

使用NIO可以api可以使用直接内存。

设置新生代代对象进入老年代的年龄

-XX:MaxTenuringThreshold=15

设置垃圾最大年龄。如果设置为0的话,则新生代对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象再新生代的存活时间,增加在新生代即被回收的概论。

他最大值为15岁,因为对象头中用了4位进行存储垃圾年龄 【1111(二进制)=15(十进制)】。

不常用的参数:

-XX:MaxHeapFreeRatio=70

GC后java堆中空闲量占的最大比例,大于该值,则堆内存会减少

-XX:MinHeapFreeRatio=40

GC后java堆中空闲量占的最小比例,小于该值,则堆内存会增加

-XX:PretenureSizeThreshold=1024

(单位字节)对象大小大于1024字节的直接在老年代分配对象

-XX:TLABWasteTargetPercent =1

TLAB占eden区的百分比 默认1%

原文地址:https://www.cnblogs.com/moonlightml/p/9902181.html

时间: 2024-11-10 04:31:12

JVM内存区域参数配置的相关文章

[Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情

本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对 JVM 是怎么使用,你怎么可以很有信心地或者是完全确定地掌握和控制数据的缓存空间呢,所

[Spark性能调优] Spark Shuffle 中 JVM 内存使用及配置详情

[Spark性能调优]  Spark Shuffle 中 JVM 内存使用及配置详情 本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Memory 的运行原理和机制 引言 Spark 从1.6.x 开始对 JVM 的内存使用作出了一种全新的改变,Spark 1.6.x 以前是基于静态固定的JVM内存使用架构和运行机制,如果你不知道 Spark 到底对

【Java高级】JVM内存区域模型和加载过程

JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小. 运行时常量池:是方法区的一部分,Class文件中除了有类的版本.字段.方法.接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中.

深入理解JVM之JVM内存区域与内存分配

深入理解JVM之JVM内存区域与内存分配 在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题. 博客出处: http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&utm_medium=referral 看了此博客后,发现应该去深入学习下jvm的内存模型,就是去认真学习下<深入理解Java虚拟机>,其内容可能会<

【转】理解JVM内存区域

引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏或溢出的情况发生,调试起来会变得非常困难.这就要求我们对虚拟机的内存区域有深入的理解.最终能够判断内存方面的异常发生时,具体在JVM中的位置. 内存区域 JVM运行时,首先需要类加载器(ClassLoader) 加载所需类的字节码,加载完毕交由执行引擎执行,执行过程中需要一段空间来存储数据(类比CP

一、JVM内存区域组成

一.JVM内存区域组成  java把内存分四种:  1.栈区(stack segment)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放内存资源  2.堆区(heap segment) — 一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收  3.静态区(data segment)— 存放全局变量,静态变量和字符串常量,不释放  4.代码区(code segment)— 存放程序中方法的二进

jvm系列 (一) ---jvm内存区域与溢出

jvm内存区域与溢出 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握. 当一个系统出现内存溢出,内存泄露的时候,因为你懂jvm知识,可以更加快速定位错误,可以通过参数去合理设置各内存区域的内存容量. 因为你对jvm的认识,写代码的时候会潜意识地让你注意代码质量,可能你会说是那是小小的性能提升,但是量变会导致质变的. jvm内存区域 jvm内存划分 方法区 虚拟机栈 本地方法栈 堆 程序计数器 程序计数器 当前线程所执行的

JVM内存区域模型

一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆” ,"perm",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小. 类太多有可能撑爆永久区:如加入JVM参数:-XX:PermSize=10M -XX:MaxPermSize=10M,运行后会报如下异常: Exception in

JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

http://blog.csdn.net/zhushuai1221/article/details/51027024 JVM内存区域划分Eden Space.Survivor Space.Tenured Gen,Perm Gen解释 以下内容转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29632145&id=4616836 jvm区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园)