首页
学习
活动
专区
圈层
工具
发布

2.3 JVM内存参数设置

我们可以对运行时数据区的内存进行参数设置. 这是jvm调优的重点. 参数的变化将影响到整体效率 ?...这里单独说一下spring boot项目启动的时候如何设置jvm参数?...方法区(元空间)参数设置 ? 在jdk8之前有各区域叫做永久代, 在jdk8及以后改名字了, 叫做元空间. 这块内存空间占用的是直接的物理内存....对于64位的JVM来说, 元空间默认大小是21M, 元空间的默认最大值是无上限的, 他的上限就是内存空间 -XX:MetaspaceSize: 元空间的初始空间大小, 以字节位单位, 默认是21M,达到该值就会触发..., 基于这种情况, 一般建议在JVM参数中将-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置成一样的值, 并设置的比初始值还要大, 对于8G物理内存的机器来说, 一般会将这两个值设置为

3.6K21

JVM 内存区域大小参数设置

jmeter工具使用系列 jmeter基础内容在线公开课 jmeter性能测试在线公开课 接口自动化课程 性能测试课程 性能测试常见面试题 性能测试技能树JVM内存包括区域 Heap(堆区)   ...) 通过JVM启动参数来配置以上内存空间   Heap(堆)内存大小设置   -Xms512m 设置JVM堆初始内存为512M   -Xmx1g 设置JVM堆最大可用内存为1G...New Generation(新生代)内存大小设置   -Xmn256m 设置JVM的新生代内存大小(-Xmn 是将NewSize与MaxNewSize设为一致。...Eden区的比值为2:8,一个Survivor区占整个新生代的1/10 Eden内存大小设置 新生代减去2*Survivor的内存大小就是Eden的大小 Old Generation(老年的)的内存大小设置...)   -XX: PermSize=128m 设置持久代初始内存大小128M   -XX:MaxPermSize=512m 设置持久代最大内存大小512M Direct ByteBuffer

10.2K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JVM 内存区域大小参数设置

    需要提前了解的知识点: JVM内存模型 JVM垃圾回收算法 下图是JVM内存区域划分的逻辑图 JVM内存区域逻辑图 从图中我们大概了解JVM相关的内存区域。...Generation(持久代) Stack(栈区) Metaspace(元空间) Direct ByteBuffer(直接内存) 下面我们就通过一些JVM启动参数来配置以上内存空间 Heap(堆)内存大小设置...-Xms512m 设置JVM堆初始内存为512M -Xmx1g 设置JVM堆最大可用内存为1G New Generation(新生代)内存大小设置 -Xmn256m 设置JVM的新生代内存大小...Old Generation(老年的)的内存大小设置 堆内存减去新生代内存 如上面设置的参数举例如下: 老年代初始内存为:512M-256M=256M 老年代最大内存为:1G-256M=768M...默认情况下,类元数据分配受到可用的本机内存容量的限制(容量依然取决于你使用32位JVM还是64位操作系统的虚拟内存的可用性)。 一个新的参数 (MaxMetaspaceSize)可以使用。

    6K150

    Kubernetes 设置Pod内存Limit和JVM限制

    Limit时,内核OOM Killer会终止容器,Pod状态变为OOMKilled; JVM内存限制 JVM内存限制主要通过 -Xmx 参数设置,它定义了Java堆的最大可用内存。...Pod内存Limit与JVM限制的协同工作原理 一个设置了 -Xmx 5G 的JVM在8G内存Limit的Pod中运行时,实际内存使用情况如下: 1、JVM堆内存:最大5GB(由 -Xmx 决定) 2、...) 最终限制 否 是(绝对上限) JVM内存与Pod内存的比例设置 合理设置 -Xmx 与Pod内存Limit的比例是避免OOMKilled的关键。...: 1、自动检测容器限制: JVM自动识别cgroups设置,无需额外配置即可感知容器内存限制。...1、Pod内存Limit是绝对上限,必须设置且应合理大于JVM -Xmx 。 2、JVM内存只是Pod总内存的一部分,需为非堆内存和其他组件预留空间。

    43200

    容器环境的JVM内存设置最佳实践

    Docker和K8S的兴起,很多服务已经运行在容器环境,对于java程序,JVM设置是一个重要的环节。这里总结下我们项目里的最佳实践。...但是需要注意的是,JVM实际使用的内存会比heap内存大: JVM内存 = heap 内存 + 线程stack内存 (XSS) * 线程数 + 启动开销(constant overhead) 默认的XSS...通常在256KB到1MB,也就是说每个线程会分配最少256K额外的内存,constant overhead是JVM分配的其他内存。...,但是jvm根据服务器配置来分配初始化内存,导致java进程超过容器限制被kill掉。...-XX:+UseContainerSupport,设置-XX:MaxRAMPercentage=75.0,这样为其他进程(debug、监控)留下足够的内存空间,又不会太浪费RAM。

    6.2K30

    容器环境的JVM内存设置最佳实践

    对于 Java 程序,JVM 设置是一个重要的环节。这里总结下我们项目里的最佳实践。 Java Heap 基础知识 默认情况下,JVM 自动分配的 heap 大小取决于机器配置。...但是需要注意的是,JVM 实际使用的内存会比 heap 内存大: JVM内存 = heap 内存 + 线程stack内存 (XSS) * 线程数 + 启动开销(constant overhead)...默认的 XSS 通常在 256KB 到 1MB,也就是说每个线程会分配最少 256K 额外的内存, constant overhead 是 JVM 分配的其他内存。...,但是 JVM 根据服务器配置来分配初始化内存,导致 Java 进程超过容器限制被kill掉。...-XX:+UseContainerSupport,设置 -XX:MaxRAMPercentage=75.0,这样为其他进程(debug、监控)留下足够的内存空间,又不会太浪费 RAM。

    2.6K10

    谈JVM线程和内存参数合理性设置

    Tech /导读/ JVM启动参数中很多与线程、内存相关。在生产实践中,对这些参数随意设置或者采用默认值可能会有一些风险,特别是在JDK低版本的容器下,可能出现容器CPU过高,GC频繁等。...该值设置过小,GC暂停时间变长影响RT,设置过大则影响吞吐量,从而导致CPU过高。 1. 参数设置 GC并发线程数可以通过JVM启动参数: -XX:ParallelGCThreads=[n]来指定。...推荐设置为容器内存的50%,不能超过容器内存的80%。...另外,容器中如果有其他进程还在消费内存,JVM内存抖动时可能申请内存失败,导致OOM。因此建议服务模式下,将Xms设置Xmx一样的值。...此默认值有点过大,MaxDirectMemorySize未设置或设置过大,有可能发生堆外内存泄露,导致进程被系统Kill。

    3.4K62

    JVM初探 -JVM内存模型

    因此最近抽时间研读了几本评价较高的JVM入门书籍, 算是总结于此....JVM 内存区域 JVM会将Java进程所管理的内存划分为若干不同的数据区域. 这些区域有各自的用途、创建/销毁时间: ? 一....直接内存 直接内存并不是JVM运行时数据区的一部分, 但也会被频繁的使用: 在JDK 1.4引入的NIO提供了基于Channel与Buffer的IO方式, 它可以使用Native函数库直接分配堆外内存,...显然, 本机直接内存的分配不会受到Java堆大小的限制(即不会遵守-Xms、-Xmx等设置), 但既然是内存, 则肯定还是会受到本机总内存大小及处理器寻址空间的限制, 因此动态扩展时也会出现OutOfMemoryError...这一步保证了对象的实例字段可以不赋初始值就直接使用(访问到这些字段的数据类型所对应的零值). 5.然后要对对象进行必要的设置: 如该对象所属的类实例、如何能访问到类的元数据信息、对象的哈希码、对象的GC

    1.4K40

    jvm(1):jvm内存模型

    身为一个职业的Java程序员,每天打交到最多的就是jvm,那么套用孙子的一句话“知己知彼方能百战不殆”,熟悉jvm也就意味着是我们进阶路上必过之槛,下面先来张图,大概说明下jvm的内存分布 ?...从图上可以看出Java内存主要分5个部分,下面会针对这5个部分分别进行说明 方法区:主要是保存的信息是类的元数据。方法区与堆空间类似,是被JVM中所有的线程共享的区域。...Java堆:堆在JVM规范里是一种通用性的内存池,用于存放所有的Java对象。堆是一个运行时数据区,类的对象从中分配空间,堆的优势是可以动态地分配内存大小,生存周期也不需要事先告诉编译器。...栈是一种快速有效的分配存储方法,访问速度仅次于寄存器,堆栈指针若向下移动,则分配新的内存,若向上移动,则释放那些内存。...由于Java虚拟机需要预先去生成相应的内存空间,所以但我们尝试运行程序的时候,Java虚拟机必须知道被存储在栈内的所有数据的确切大小和生命周期,以便按照上面陈述的分配存储方法通过上下移动堆栈指针来动态调整内存空间

    1.2K30

    【JVM】剖析JVM内存模型

    JVM在执行java程序时的过程中会把它所管理的内存划分为若干个不同的数据区域。...1、方法区(元数据空间)   方法区与Java堆一样,是各个线程共享的内存区域。方法区是jvm的元数据区域,类比成为一张表,一个class文件的信息都是表的一条数据存储在内存中。...Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。   Java 堆是垃圾回收机制的主要区域。...当常量池无法在申请到内存时将抛出OutOfMenoryError错误。 6、直接内存   直接内存并不是JVM虚拟机运行时数据区的一部分,也不是JVM虚拟机规范中定义的内存区域。...此区域是JVM规范中没有规定任何OutOfMenoryError的区域。

    1.1K30

    JVM初探 -JVM内存模型

    二、JVM内存空间管理 根据JVM规范,JVM把内存划分了如下几个区域: 1. 方法区 2. 堆区 3. 本地方法栈 4. 虚拟机栈 5....对于堆区大小,可以通过参数-Xms和-Xmx来控制,-Xms为JVM启动时申请的最新heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于...对于系统而言,为了避免在运行期间频繁的调整Heap大小,我们通常将-Xms和-Xmx设置成一样。...三、JVM内存分配 Java对象所占用的内存主要在堆上实现,因为堆是线程共享的,因此在堆上分配内存时需要进行加锁,这就导致了创建对象的开销比较大。...(允许担保失败),如果允许,则只会进行MinorGC,此时可以容忍内存分配失败;如果不允许,则仍然进行Full GC(这代表着如果设置-XX:+Handle PromotionFailure,则触发MinorGC

    1.5K20

    【JVM 札记】JVM 内存划分

    是否有必要学习 JVM 为什么要了解 JVM 的内存划分或者内存管理呢?其实本身我觉得是没有太多必要的,因为作为一个普通的程序员而言,去了解它是一种破坏黑盒子的行为。...但是,JVM 提供了自动的内存管理机制,它的内存自动管理机制虽然有很多实现方式,但是在各种不同的场景下它不一定是最优的。...为什么进行内存划分 既然需要了解 JVM 的内存划分,那么就先说说 JVM 为什么要进行内存划分呢?这个其实比较好理解,因为这种划分区域的方式可以说随处可见。...当然了,虽然这是事实,但是也并不说明内存按属性划分的管理方式有问题) JVM 内存大致划分 JVM 作为虚拟机的存在可以被认为是一台独立的机器,.class 作为 JVM 上的可执行文件,因此,JVM...当堆中的对象不再使用时,JVM 会在某个时间点回收这些内存空间。

    52310

    JVM 彻底搞懂JVM内存区域及直接内存

    B站搜索“乐哥聊编程“有本篇文章配套视频‍ https://www.bilibili.com/video/BV1rg411v7rw 面试题:直接内存会导致OOM么?...本地方法栈 本地方法栈和虚拟机方法栈作用类似,不过它是为执行native方法服务 堆 堆是被线程共享的一个内存区域,大部分对象都在堆上分配,少部分允许在栈上分配(通过逃逸分析)。...方法区 方法区也是一块内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。也包括运行时常量池。...jdk8以前主要通过永久代实现方法区 jdk8开始 通过元空间实现方法区 通过本地内存实现 直接内存 直接内存和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理...传统BIO 访问 直接内存访问

    1.3K20

    Jvm内存划分

    在Java开发中我们不用考虑对内存的管理,是因为Jvm帮我们做了很多工作。Jvm为了满足不同的用途将内存大体划分了下面几部分。如下图: ? 下面我们详细介绍一下每一块的具体的功能。...只不过不同的是,这个计数器不是针对程序来说的,而是真对线程来说的,因为每一个线程可能执行的逻辑是不一样的,所以Jvm就要知道每一个线程在上一次的执行位置。所以程序计数器,每一个线程都是独立的。...堆:Jvm中管理内存的最大的地方。它的作用是存储对象的实例。我们可以通过设置-Xmx和-Xms控制堆大小。堆也是Jvm中垃圾回收器回收的主要地方。并且堆内存是所有线程所共享的区域。...方法区:和堆一样也是所有线程共享的内存区域,不同是的是它主要存储被虚拟机加载的类信息、常量、静态变量等信息。 运行时常量池:常量池存放在方法区中,主要保存编译时生成的字面量和符号引用。

    93520

    【JVM内存区域】

    博主:java_wxid 社区:幕后大佬 @TOC 本文的大概内容: JVM内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】...在 Hotspot JVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应。 线程共享区域随虚拟机的启动/关闭而创建/销毁。...直接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的使用 在 JDK 1.4 引入的 NIO 提 供了基于 Channel 与Buffer 的 IO 方式, 它可以使用 Native函数库直接分配堆外内存...由于现代JVM采用分代收集算法, 因此 Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。...方法区/永久代(线程共享) 永久代(Permanent Generation), 用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    1.2K10

    JVM内存区域

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为多个区域,这些区域各有自己的用途以及独特的创建和销毁时间,今天就来揭开这些不同的数据区域的神秘面纱 先来一张最经典的图: ?...栈 本地方法栈和虚拟机栈可以统称为栈,由于本地方法栈是jvm调用操作系统native方法所使用的栈且它们的作用是非常相似的,所以这里重点看一下虚拟机栈。...它描述的java方法执行的内存模型 为什么是Java方法执行的内存模型呢? 在虚拟机中,每一次方法调用都会创建栈帧,这个栈帧的生命周期就伴随着这个方法的执行周期。...关于堆的更多内容请持续关注博客更新 方法区 方法区同样是各个线程共享的内存区域,它主要存储已经被虚拟机加载的类信息 类信息 类的全限定名 父类的全限定名 直接实现接口的全限定名 类型标志 类的访问描述符...Class.forName获取的引用 方法表 非抽象类、非接口的类才会有,一个保存类中所有的方法的数组,数组中每个每个元素是对每个方法的直接引用 运行时常量池 当类和接口被加载到JVM

    1.5K40

    jvm系列(二):JVM内存结构

    我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?...先看一张图,这张图能很清晰的说明JVM内存结构布局。 ? JVM内存结构主要有三大块:堆内存、方法区和栈。...在通过一张图来了解如何通过参数来控制各区域的内存大小 ? 控制参数 -Xms设置堆的最小空间大小。 -Xmx设置堆的最大空间大小。 -XX:NewSize设置新生代最小空间大小。...-XX:MaxNewSize设置新生代最大空间大小。 -XX:PermSize设置永久代最小空间大小。 -XX:MaxPermSize设置永久代最大空间大小。 -Xss设置每个线程的堆栈大小。...没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。 老年代空间大小=堆空间大小-年轻代大空间大小 从更高的一个维度再次来看JVM和系统调用之间的关系 ?

    1.3K40
    领券