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

JAVA系列之JVM内存调优

一、前提 JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响。在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解。...同时,在进行性能调优前,您需要理解并掌握以下的相关基础理论知识: 1、JVM垃圾收集器和垃圾回收算法 2、JVM性能监控常用工具和命令 3、JVM运行时数据区域 4、能够读懂gc日志 5、内存分配与回收策略...Interface元数据,存储的是Java运行时的一些环境。这个区域不存在垃圾回收!关闭虚拟机就会释放这个区域的内存。...一般来说内存溢出主要分为以下几类: 堆溢出(java.lang.OutOfMemoryError: Java heap space) 栈深度不够( java.lang.StackOverflowError...可以很方便的监视本地及远程服务器的java进程的内存使用情况。

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

    MONGODB 性能与调优 -- 内存调优 2 (怎么计算驱逐率与调整参数)

    eviction blocked']*100 / wtt['cache']['eviction server evicting pages'] 上面的公式主要的含义为,我从我驱逐的页面再次获得我要的信息,与我从内存中驱逐的页面之比...可以解决一部分的问题,但如果你的硬件真的不怎么样,这样做也是徒劳。...其实徒劳的原因和下一个我们说的操作 CHECKPOINT 有关, 大量的数据写入到内存中,必须要找时间释放到磁盘上,将脏页刷新到磁盘,默认的刷新时间为60秒, 那么一个不好的checkpoint 会产生什么影响...这里有两个参数我们上面使用过了 eviction_dirty_trigger eviction_dirty_target_settings 这里会牵扯几个问题,1 多少信息保留在cache中 2 什么情况下会触发将内存的数据刷到我们的磁盘上...来查看系统的性能的情况下,qw会持续的走高,这说明写入在进行排队的操作,WiredTiger无法满足数据插入的情况,此时如果CPU 负载不高情况下,可以调整上面的参数看看是否有改善,但带来的问题就是内存会使用率上升

    1.4K50

    Java性能调优--代码篇:String内存优化

    发现不存在,于是将"abc"初始化到常量池中,str_1引用该内容: ? 2、String str_2 = "abc"; 再次创建相同字符串"abc",同样在常量池中查询"abc"是否已存在 ?...那么大家试想一下,如果String可变的话,这种常量池存放字符串,内容相同则不再开辟空间而是指向同一引用的设计思想是否还可行,是不是即便创建了相同的字符串也要重新分配内存,造成不必要的内存损耗。...2 Stirng.intern:从20G到百兆内存消耗 该优化方法分享自全球知名社交平台推特(Twitter)的一名工程师,使用这种方法成功帮助他将String的内存消耗从20G降到几百兆。...而在堆内存中的两个对象,由于没有引用指向它,将会被垃圾回收。所以 a 和 b 引用的是同一个对象。...+ "c"; 我将上面代码编译成的class文件通过反编译之后的结果: String str = "abc"; 所以事实是:在拼接String常量的时候,编译器对代码进行了优化,将字符串合并了

    1.2K30

    【JVM调优(一)】----JAVA内存模型抽象结构

    线程之间的通信机制有两种:共享内存和消息传递。 Java线程之间的通信由Java内存模型(JMM)控制,JMM控制一个线程对共享变量的写入什么时候对另一个线程可见。...线程之间的共享变量存储在主内存中(Main Memory),每一个线程都有自己的本地内存(Local Memory),本地内存中存储着读/写共享变量的副本。...由上图可以看出,线程之间的通信由两个步骤: 线程A把修改后的本地内存中的共享变量更新到主内存中去 线程B到主内存中读取线程A之前更新过的共享变量 ?...从整体上看,这就是线程A在向线程B发送消息,而且这个消息必须经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。

    56910

    OpenHarmony 轻内核调测-内存调测-内存信息统计

    内存调测方法旨在辅助定位动态内存相关问题,提供了基础的动态内存池信息统计手段,向用户呈现内存池水线、碎片率等信息;提供了内存泄漏检测手段,方便用户准确定位存在内存泄漏的代码行,也可以辅助分析系统各个模块内存的使用情况...本文分析下内存信息统计。1、基础概念内存信息包括内存池大小、内存使用量、剩余内存大小、最大空闲内存、内存水线、内存节点数统计、碎片率等。...内存水线:即内存池的最大使用量,每次申请和释放时,都会更新水线值,实际业务可根据该值,优化内存池大小;碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式...// 内存池的剩余内存大小 UINT32 maxFreeNodeSize; // 内存池的最大空闲内存块大小 UINT32 usedNodeNum; // 内存池的非空闲内存块个数...内存碎片率计算同样调用LOS_MemInfoGet接口,可以获取内存池的剩余内存大小和最大空闲内存块大小,然后根据公式(fragment=100-100*最大空闲内存块大小/剩余内存大小)得出此时的动态内存池碎片率

    20010

    Spark内存调优

    理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优。本文旨在梳理出 Spark 内存管理的脉络,抛砖引玉,引出读者对这个话题的深入探讨。...本文中阐述的原理基于 Spark 2.1 版本,阅读本文需要读者有一定的 Spark 和 Java 基础,了解 RDD、Shuffle、JVM 等相关概念。...,在访问时则需要进行序列化的逆过程——反序列化,将字节流转化为对象,序列化的方式可以节省存储空间,但增加了存储和读取时候的计算开销。...如果需要进行最终结果排序,则要将再次将数据交给 ExternalSorter 处理,占用堆内执行空间。...Spark 用 MemoryBlock 巧妙地将堆内和堆外内存页统一抽象封装,并用页表(pageTable)管理每个 Task 申请到的内存页。

    1.5K30

    OpenHarmony 轻内核调测-内存调测-内存泄漏检测

    1、基础概念内存泄漏检测机制作为内核的可选功能,用于辅助定位动态内存泄漏问题。开启该功能,动态内存机制会自动记录申请内存时的函数调用关系(下文简称LR)。...有3点原因如下:LOS_MemAlloc接口内部也有函数调用;外部可能对LOS_MemAlloc接口有封装;LOSCFG_MEM_RECORD_LR_CNT 配置的LR层数有限;正确配置这个宏,将无效的...3、开发指导3.1开发流程该调测功能可以分析关键的代码逻辑中是否存在内存泄漏。开启这个功能,每次申请内存时,会记录LR信息。...,且每个内存节点都会记录LR地址,内存开销也加大。...调用LOS_MemUsedNodeShow接口,输出全部节点信息打印;申请内存,但没有释放,模拟内存泄漏;再次调用LOS_MemUsedNodeShow接口,输出全部节点信息打印;将两次log进行对比,

    20810

    Java内存大家都知道,但你知道要怎么管理Java内存吗?

    前言 深入研究Java内存管理,将增强你对堆如何工作、引用类型和垃圾回收的认识。 你可能会思考,如果你使用Java编程,关于内存如何工作你需要了解哪些哪些信息?...堆 堆内存将实际对象存储在内存中。这些对象被堆栈中的变量引用。...仅与引用队列一起使用,因为此类引用的.get()方法将始终返回空值。这些引用类型被认为是优于终结器的。 如何引用字符串 Java中对字符串类型的处理略有不同。...内存分配进程是宝贵的,因此要为堆分配一个合理的初始最大内存空间。如果你知道一开始使用较小的初始堆空间是没有意义的,JVM将扩展这个内存空间。...根据以下命令来明确内存空间: (1)初始堆大小 -Xms512m 将初始堆大小设置为512 mb。 (2)最大堆大小 -Xmx1024m 将最大堆大小设置为1024 mb。

    1.2K20

    面试官:怎么做JDK8的内存调优?

    面试官:怎么做JDK8的内存调优? 看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题。...擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说: 在内存调优之前,需要先了解JDK8的内存区域是怎么划分的: JDK8内存结构 JDK8的内存结构主要包括程序计数器(Program Counter...如果年轻代的内存太小,那么将执行许多次垃圾回收。如果年轻代的内存太大,那么执行完整的垃圾回收可能需要很长时间才能完成。一般建议把年轻代的大小保持在整个堆大小的1/2到1/4之间。...下面的例子是把元空间所分配内存的最大值设置为512MB: -XX:MaxMetaspaceSize=512M 面试官微笑地说:这些常用的内存调优参数总结的不错,可以结合这些参数写一个内存调优实例吗?...内存调优的参数基本敲定,用它启动一个名为one-more-study-0.0.1-SNAPSHOT.jar的jar文件: java -server -Xmx8G -Xms8G -Xmn3G -XX:SurvivorRatio

    80420

    JVM内存调优工具篇之java自带工具

    jdk在安装的时候会提供一些性能分析、故障诊断、JVM监控之类的工具,了解这些工具对我们分析JVM内存、JVM调优有一定的帮助,本篇文章来学习一下。...-gcnewcapacity 显示新生代内存大小 -gcold 显示老年代统计信息 -gcoldcapacity 显示老年代内存大小 -gcmetacapacity 显示元空间内存大小 -gcutil...jmap jmap(Memory Map for Java) 打印给定进程或远程调试服务器的共享对象内存映射或堆内存详细信息。...jstack jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。...-l:打印有关锁的其他信息,例如拥有java.util.concurrent同步器的列表 可视化工具 对于桌面操作系统,java提供了jconsole和jvisualvm可视化工具。

    1.3K20

    Redis调优 | 内存碎片

    内存情况查看 1.1 Redis 内存查看 Redis可以使用 info命令查看节点内存信息占用情况. 127.0.0.1:6379> info memory # Memory# Redis 保存数据申请的内存空间...:2.34M # Redis 进程在运行过程中占用的内存峰值 used_memory_peak:910608 used_memory_peak_human:889.27K # 使用内存达到峰值内存的百分比...:0 1.2 内存碎片 通过上述命令可以发现, Redis的内存实际使用量和申请空间是不相同的, 这也就是内存碎片....值>1 表示有内存碎片, 越大表明越多; ratio值内存, 虚拟内存其实就是硬盘, 性能比使用内存低很多, 最好增加内存提高性能; 一般来说, ratio值在1 - 1.5之间是比较健康的...内存回收会使Redis集群的响应变慢, 因为内存碎片整理是在主线程中执行的, 通过源码发现, 内存碎片整理操作会scan迭代整个 redis 节点, 并进行内存复制, 转移等操作. 3.

    2.3K10

    RabbitMQ——内存调优(二)

    在队列堆积的情况下,rabbitmq的大部分内存占用是队列中的消息,这些消息占用的内存大概由这么几块组成: 1、生产者发送的消息在真正写入文件前会在内存中缓存,这个缓存的最大数量是根据配置queue_index_max_journal_entries...: (4096+400+200+16384+50)*64*4KB = 5282.5MB 当然除了缓存消息占用的内存,内存的占用还包括进程的堆、ets表等等,但这些相比消息在内存中占用的大小要小很多很多。...这种情况下,允许的缓存最大大小为 128MB*30*12 = 45GB,这样可以满足所有队列堆积时缓存消息所需的内存,那么从系统中申请释放内存的次数自然也就少了,整体的吞吐量自然也就上去了。...【总结】 通过调整erlang运行时系统中内存分配的相关参数,特定场景的性能会有一定的提升。另外,erlang运行时系统中内存分配可调整的参数还有很多,比如内存分配算法,比如mbc池的策略等等。...有兴趣的朋友也可以研究并实测调优下。

    2K20

    RabbitMQ——内存调优(一)

    【前言】 在《RabbitMQ——调优参数》一文中提到了rabbitmq相关的参数,对相关参数进行调整后测试发现在队列无堆积的情况下, 生产消费速度有明显提升;而在队列消息堆积的情况下,生产消费速度还是没有明显变化...runntime system)内部的线程锁,发现其内存分配的效率比较低,又进一步挖掘了下erlang的内存分配管理相关知识,并通过相关参数调优后,其性能有了显著的提升,因此对相关知识进行总结以便后续回顾...内存的调优分两部分:本文主要总结erlang内存相关的概念知识,下一篇文章总结rabbitmq内存相关知识与调优。...这些不同的策略,有的是为了减少内存碎片,提高内存分配的效率;有的是为了加快分配速度,但可能会存在一定的内存浪费。...整体构架如下图所示 【erlang内存分配相关参数】 erlang内存分配提供了一些设置参数,而这也是调优最多的地方,一些常用的参数有: 分配器的启用禁用 +Me true|false 其中S是一个变量

    1.6K10
    领券