精华内容
下载资源
问答
  • 2021-08-06 02:42:20

    你们知道怎么查看内存条参数信息吗?跟着小编一起学习怎么查看内存条参数信息吧。·

    查看内存条参数信息的方法

    [内存标贴]

    如下图,观察内存条外观时看到的标贴。标贴上一般会告诉我们品牌、参数、料号(P/N)、产品编号(S/N)等信息。在选购内存时可以通过标贴得到内存基本信息。

    [P/N与S/N]

    P/N又叫料号,宇瞻、金士顿等这些内存模组厂商生产内存时,如果生产内存选用的内存颗粒、PCB(印刷电路板)等原料一致,那么厂商就会为这些内存印上相同的P/N;也就是说,只要两条内存的P/N一致,那么这两条内存出现不兼容问题的几率非常非常低。S/N称为产品编号,因为S/N都是唯一的,所以它对检查内存防伪有帮助。

    [标贴表达方式1]

    内存标贴涵盖了上述几方面的内容,下面来研究标贴上最重要的部分—内存参数。标贴上内存参数表达方式分了好几种,但几种表达方式所指的信息都基本一致,比如容量、带宽、延迟、频率等参数。如下图标贴直接表达了内存的参数-内存代数(PC3=DDR3)、内存容量(4GB)、内存带宽(10600MB/S)全部标记在了上面,并可以计算出频率(1333MHz)。

    [标贴表达方式2]

    下图红色方框里的内容,是目前金士顿内存比较常见的标注方式,可以从“KVR1333D3S9/1G”中的“1333”、“D3”、“1GB”这几个字样知道这条内存是DDR3 1333 1GB的内存。如果觉得这种方法获取内存信息比较困难,可以注意之下的“1GB PC3-10600 CL9 204-Pin SDDIMM”的字样。“1GB”、“CL9”、“204-Pin”分别告诉我们内存容量是1GB、延迟是9、金手指为204Pin(也就是指内存边缘的针脚两面加起来有204片)。

    解释一下“PC3-10600”的含义,“PC3-10600”是内存模组厂商比较通用的一种用内存带宽表示内存参数的方法,虽然没有谁制定这种标法的标准,但很多厂商都依循着下面这种方法标示内存信息:PC3表示DDR3的意思,如果是PC则表示DDR,PC后面的数字代表内存是第几代;10600就是指的内存带宽为10.6GB/s,按照计算前端总线带宽的公式(带宽=位宽×频率÷8),这个公式对于计算内存带宽同样适用。目前内存位宽为64bit,这样就可以通过这个公式计算出频率或者带宽的值。比如PC3-10600内存,它的带宽就为10.6GB/s(10600MB/s,1GB约等于1000MB),10600MB/s=64bit×频率÷8,所以等效频率就等于1333MHz,与内存标贴获取的内存频率一致。

    [台式机三代内存条对比]

    [内存颗粒]

    对比前面两种表示方法,不难发现下图红框中的“512M×16”是与它们不同的。“512M”说明这条内存的内存颗粒是512Mb(注意是b)的规格,也就是每一颗内存颗粒是64MB的容量,“×16”说明这条内存有16颗这样的内存颗粒,64MB×16=1024MB就说明这条内存的总容量为1GB。

    [内存与CPU搭配问题]

    合理搭配内存才能让内存和CPU充分发挥性能。

    内存和CPU如何搭配主要看带宽。下图中显示,CPU要和内存交换数据需要要通过两个通道:

    处理器和主板(北桥芯片)的通道

    主板(北桥芯片)和内存的通道

    只要两个通道都大于或者等于CPU需要的数据量,那么数据传输就不会出现瓶颈问题。

    比如CPU和北桥芯片的通道带宽为8.5GB/s,那么只要内存带宽等于或者大于这个带宽就可以了。

    通过带宽公式计算,8.5GB/s=64bit×频率÷8,计算出一根等效频率为1066MHz的内存就可以满足了。

    如果是组成双通道,内存位宽就会由64bit变为128bit,8.5GB/s=128bit×频率÷8,所以两条等效频率为533MHz的内存组成双通道就可以满足CPU带宽的需要。

    [软件查询信息]

    除从标贴获取内存信息的方法之外,还可以采用CPU-Z软件查询内存信息的方法。下图所示是CPU-Z的界面,它是一个查看电脑硬件基本信息的软件,右下角是软件的版本号,最好下载使用最新版本,才能正确识别硬件的信息,特别是较新硬件产品。选择内存选项卡查看内存信息,在常规项目中,软件标示了内存类型是DDR2,总容量为2GB(2048MB),组成了双通道(通道数标示为双通道)。同时标示了CAS#延迟时间、RAS#到CAS#延迟等几个参数,最重要的就是第一个CL,内存厂商常把它标注在标贴上。

    [SPD选项卡]

    SPD选项卡显示的就是SPD芯片(Serial Presence Detect,串行配置侦测)的内存信息。从下图可以知道,主板安装了两条内存,分别插在内存1#、3#插槽上,内存是DDR2代,两条内存容量均是1GB(模块大小1024MB),带宽分别为5.3GB/s(PC2-5300)、6.4GB/s(PC2-6400),一号插槽内存模组的生产日期为2008年第31周(31/08),三号插槽内存模组厂商是宇瞻科技、生产日期为2010年第7周(07/10)。

    还可以通过对比两条插在不同插槽上的内存的型号和序列号,了解这两条内存的兼容性如何。这两条插在插槽1和插槽3上的内存颗粒编号和序列号完全不同,这说明这两条内存有可能出现兼容性问题。

    此外还有内存电压,需要指出的是这几个频率代表的是内存的工作频率,200MHz、266MHz、333MHz、400MHz这几个频率同时出现,实际工作频率为266MHz,由于组建了双通道,说明内存等效工作频率为533MHz。

    查看内存条参数信息相关文章:

    1.如何查看本机内存条型号

    2.怎么查内存条型号规格

    3.如何查看笔记本内存条参数

    4.win7怎么查内存条型号

    5.如何查金士顿内存条型号

    更多相关内容
  • 主要介绍了MySQL8.0内存相关参数总结,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
  • MySQL8.0内存相关参数介绍

    千次阅读 2021-01-19 04:45:49
    本文来自读者投稿作者:姚远首先我们给出MySQL内存使用的计算公式:MySQL理论上使用的内存 = 全局共享内存 + max_connections×线程独享内存。也就是:innodb_buffer_pool_size + innodb_log_buffer_size + thread_...

    本文来自读者投稿

    作者:姚远

    首先我们给出MySQL内存使用的计算公式:

    MySQL理论上使用的内存 = 全局共享内存 + max_connections×线程独享内存。

    也就是:innodb_buffer_pool_size + innodb_log_buffer_size + thread_cache_size +table_open_cache + table_definition_cache +key_buffer_size + max_connections *( thread_stack+ sort_buffer_size+join_buffer_size + read_buffer_size+read_rnd_buffer_size+ binlog_cache_size+tmp_table_size)

    下面我们按照全局内存参数与线程独享参数分类,简单介绍下相关参数的作用。

    全局共享内存

    innodb_buffer_pool_size

    innodb_buffer_pool_size这个参数是对Mysql数据库最重要的参数之一,它对 InnoDB 存储引擎的作用类似于 Key Buffer Cache 对 MyISAM 存储引擎的影响,主要区别是 InnoDB Buffer Pool 不仅仅缓存索引数据,会缓存表的数据,而且完全按照数据文件中的数据快结构信息来缓存,这一点和 Oracle SGA 中的 database buffer cache 类似,因此在SHOW ENGINE innodb status中查到的Buffer pool size要乘以16K。

    可以通过 (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) Innodb_buffer_pool_read_requests * 100% 计算得到 InnoDB Buffer Pool 的命中率。

    innodb_change_buffering

    change buffering是MySQL5.5加入的新特性,change buffering是insert buffer的加强,insert buffer只针对insert有效,change buffering对insert、delete、update(delete+insert)、purge都有效。当修改一个索引块(secondary index)时的数据时,索引块在buffter pool中不存在,修改信息就会被cache在change buffer中,当通过索引扫描把需要的索引块读取到buffer pool时,会和change buffer中修改信息合并,再择机写回disk。

    目的还是为了减少随机IO带来性能损耗,说明白了:把随机IO尽量变成顺序IO。现在SSD盛行,在SSD上随机访问和顺序访问性能几乎差不多的情况下,change buffering特性不会带来多大的性能提升,但对于廉价的机械硬盘,这个参数还是能帮助提高性能的。

    change buffering由参数innodb_change_buffering控制:

    all:  buffer inserts, delete-marking operations, and purges.

    none:  Do not buffer any operations.

    inserts:  Buffer insert operations.

    deletes:  Buffer delete-marking operations.

    changes:  Buffer both inserts and delete-marking.

    purges:  Buffer the physical deletion operations that happen in the background.

    注意这个内存是在Innodb的buffer pool中分配的,计算总内存的时候不用算它。

    innodb_change_buffer_max_size

    表示change buffer在buffer pool中的最大占比,默认25%,最大50%。如果系统中有严重的insert、update并且还有活跃的delete时,就增大max_size;针对不更改数据的纯报表系统,可以减小该参数值。

    innodb_log_buffer_size

    这是 InnoDB 存储引擎的事务日志所使用的缓冲区。为了提高性能,也是先将信息写入 Innofb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。innodb_flush_log_trx_commit 参数可以设置为0,1,2,解释如下:

    0:log buffer中的数据将以每秒一次的频率写入到logfile中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作,该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失;

    1:在每次事务提交的时候将log buffer 中的数据都会写入到logfile,同时也会触发文件系统到磁盘的同步,该模式是最安全的,但也是最慢的一种方式;

    2:事务提交会触发log buffer 到logfile的刷新,但并不会触发磁盘文件系统到磁盘的同步,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。

    thread_cache_size

    线程池缓存大小,当客户端断开连接后将当前线程缓存起来,当在接到新的连接请求时快速响应无需创建新的线程 。这尤其对那些使用短连接的应用程序来说可以极大的提高创建连接的效率。可以通过(Connections - Threads_created) Connections * 100% 计算出连接线程缓存的命中率。也可以通过如下几个MySQL状态值来适当调整线程池的大小:mysql> show global status like 'Thread%';

    +-------------------+-------+

    | Variable_name | Value |

    +-------------------+-------+

    | Threads_cached | 2 |

    | Threads_connected | 1 |

    | Threads_created | 3 |

    | Threads_running | 2 |

    +-------------------+-------+

    4 rows in set (0.01 sec)

    当 Threads_cached 越来越少 但 Threads_connected 始终不降,且 Threads_created 持续升高,可适当增加 thread_cache_size 的大小。

    table_open_cache

    table_open_cache指定表高速缓存的大小,用来缓存表文件的文件句柄信息。当我们的客户端程序提交Query给MySQL的时候,MySQL需要对Query所涉及到的每一个表都取得一个表文件句柄信息,如果没有Table Cache,那么MySQL就不得不频繁的进行打开关闭文件操作,无疑会对系统性能产生一定的影响,每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。注意,这里设置的是可以缓存的表文件句柄信息的数目,而不是内存空间的大小。

    通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_open_cache的值。其中Open_tables是当前正在打开表的数量,Opened_tables是所有已经打开表的数量。注意,不能盲目地把table_open_cache设置成很大的值,设置太大超过了shell的文件描述符(通过ulimit -n查看),造成文件描述符不足,从而造成性能不稳定或者连接失败。如果发现open_tables等于table_open_cache,并且opened_tables在不断增长,那么你就需要增加table_open_cache的值了(上述状态值可通过SHOW GLOBAL STATUS LIKE 'Open%tables'获得)。如果Open_tables的值已经接近table_cache的值,且Opened_tables还在不断变大,则说明mysql正在将缓存的表释放以容纳新的表,此时可能需要加大table_cache的值。对于大多数情况,比较适合的值:

    Open_tables Opened_tables >= 0.85

    Open_tables table_cache <= 0.95

    建议把MySQL数据库放在生产环境中试运行一段时间,然后把参数的值调整得比Opened_tables的数值大一些,并且保证在比较高负载的极端条件下依然比Opened_tables略大。

    table_definition_cache

    table_definition_cache和table_open_cache类似,前者缓存frm文件,关于后者,文档中并没有说明,应该是ibd/MYI/MYD;

    状态值:

    Open_table_definitions:表定义文件.frm被缓存的数量

    Opened_table_definitions:历史上总共被缓存过的,frm文件数量

    key_buffer_size

    key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%'获得)。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。

    max_connections

    MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量。如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。数值过小会经常出现ERROR 1040: Too many connections错误,可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。max_used_connections max_connections * 100% (理想值≈ 85%) 如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。

    线程/会话/连接独享内存

    binlog_cache_size

    为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存,可以提高记录bin-log的效率,默认32K,没有大事务,dml也不是很频繁的情况下可以设置小一点,如果事务大而且多,dml操作也频繁,则可以适当的调大一点。

    数据库binlog_cache_size的使用情况,可以查看:Binlog_cache_disk_use表示因为我们binlog_cache_size设计的内存不足导致缓存二进制日志用到了临时文件的次数,Binlog_cache_use  表示 用binlog_cache_size缓存的次数

    tmp_table_size和max_heap_table_size

    tmp_table_size规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下,默认:mysql> show variables like "tmpdir";

    +---------------+-------+

    | Variable_name | Value |

    +---------------+-------+

    | tmpdir | /tmp/ |

    +---------------+-------+

    优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。如果需要的话并且你有很多group by语句,并且你有很多内存,增大tmp_table_size(和max_heap_table_size)的值。这个变量不适用与用户创建的内存表(memory table)。

    可以比较内部基于磁盘的临时表的总数和创建在内存中的临时表的总数(Created_tmp_disk_tables和Created_tmp_tables),一般的比例关系是:

    Created_tmp_disk_tables/Created_tmp_tables<5%

    max_heap_table_size定义了用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。这个变量支持动态改变,即set @max_heap_table_size = xxx。

    如果你喜欢我的文章

    请在文末右下角点一下在看❤

    b498055dde09e190dab948e81a82bd08.png

    展开全文
  • 配置内存相关参数 前面我们说过,内存的使用对于MySQL的性能是非常重要的,所以如何正确的配置MySQL服务器所使用的内存参数,就显得至关重要,MySQL对内存的使用我们可以分为两类: 无法通过配置参数所配置的...
    • 前言

    前面的我们为大家介绍了,Mysql这个测试参数的作用域,以及如何对全局还有session参数进行配置,下面我们就来看一看具体的参数的配置项

    • 配置内存相关的参数

    前面我们说过,内存的使用对于MySQL的性能是非常重要的,所以如何正确的配置MySQL服务器所使用的内存参数,就显得至关重要,MySQL对内存的使用我们可以分为两类:

    1. 无法通过配置参数所配置的,如果MySQL服务器运行、解析、查询以及内部管理所消耗那种内存,这是无法通过配置参数所配置的;
    2. 可以通过参数配置所控制的,如各类的缓冲池所使用的内存。

    问:如何对MySQL所使用的内存进行配置?

    答:

    1. 确定可以使用的内存的上限【在所有的操作系统上,都存在可以给MySQL服务器做使用内存上限的限制,最根本的一点的是我们给MySQL服务器配置的可以使用的内存呢,是不能超过服务器本身安装的物理内存的,不要以为是在开玩笑,没有人会这样配置,但是实际上呢,见过很多这样的配置的情况,比如说的一些进程使用的内存配置的过大时,当MySQL连接突然增长,就会产生这样的情况,从而导致MySQL服务器因为内存溢出而崩溃,另一方面的限制还和我们所使用的操作系统的架构有关系,32位的操作系统对于一个进程可以使用内存呢,就是有限制的,因为MySQL就是在单进程下运行的,所以,如果使用的是32位操作系统的话,可能就只能使用3G以内的那种内存了,所以之前也建议过大家,对于现代的服务器和操作系统来说,都一定要使用64位这种架构的】
    2. 确定买MySQL每个连接使用的内存【MySQL对于一些缓存是会对每个连接单独分配的,所以呢,如果连接数越大,暂用的内存也就会越多】

    这个参数中需要注意的主要是有以下几个:

    • 首先第一个是排序缓冲区的尺寸(sort_buffer_size)【这个参数决定了MySQL每个线程使用的排序缓存区的这个大小,MySQL并不是在连接初始化的时候就会给每个缓冲区分配内存,而是在有查询需要做排序操作时,才会为每个缓冲区分配内存,然而重要的是一旦查询需要排序,MySQL会立即分配这个参数指定大小的全部内存,而不管该排序是否需要这么大内存,有时候人们为了某些大的查询的排序,可以效率高一些,比如说一百兆,如果有一百个连接同时进行排序,那么MySQL就会占用十个g左右的内存,所以很容易造成这种服务器的内存溢出,所以呢,大家在进行这个参数配置的时候呢,一定要多加小心】
    • 连接缓冲区的尺寸(join_buffer_size),SQL每个线程所使用连接缓冲区的大小,对于这个参数需要注意的是,如果一个查询中关联了多张表,就会为每一个关联的分配一个连接缓冲,每个查询可能会多个连接缓存,所以这个参数也不可能设置得太大。
    • 读缓冲区的尺寸(read_buffer_size)这个参数指定了当对MyISAM表进行全表扫描时,所分配的读缓冲池的大小,MySQL只会在有查询需要时,才会被该缓存的分配内存,同样会一次性分配该参数大小的内存,这个参数的大小一定要是4k的一个倍数。
    • 索引缓冲区的尺寸(read_rnd_buffer_size)下面这个参数的控制的是索引缓冲区的大小,MySQL也只是会在有查询需要时才会对该缓冲区的分配内存,并且只能分配需要的内存大小,而不是参数指定大小。

    总结:

    全是为每个线程所分配的,如果我们有一百个链接,那么可能会分配一百倍以上四个参数及内存大小的核,所以如果以上四个内存参数的配置的过大,很有可能会造成很大的内存浪费,这是造成MySQL的内存溢出,而使的MySQL服务器崩溃。

    • 如何为缓冲池配置内存

    InnoDB存储一起不尽要缓存索引还要数据,hash索引插入、缓冲、锁以及其他的内部数据结构,前面提到InnoDB还使用缓存池拿来帮助延迟写入,这样就能合并多个写入操作,然后一起顺序的写入到磁盘,总之InnoDB性能的严重依赖于缓存池时,所以呢,我们必须保证给他分配的足够多的内存。

    问:如果我们的系统中只使用了InnoDB表,InnoDB缓存池的大小了如何计算?

    答:也就是总内存减去每个线程所需的内存乘以连接数,这个就是我们前面所介绍的,所有单个线程所需要的内存的总和,乘以我们可能达到大的连接数,再减去系统保留的内存,大致就是InnoDB的缓存池的大小了。

     

    解析:在Mysql手册中的建议的InnoDB大小的,应该为服务器内存的75%以上,我们还必须要考虑很多其他的一些因素,当然啦,如果我们当InnoDB表数量很小,并且在很长一段时间内的增长都是可以预计的话,那也就没有必要把剩余的所有内存都分配给InnoDB缓存池,因为缓存池的内存总量如果超过了,InnoDB表的总数量加索引所占用的空间的大小的话呢,那就没有意义了,如果我们的数据量会快速增长,就需要InnoDB缓存池预留一些空间,因为MySQL 5.7之前的版本来说,InnoDB缓存池的大小的变更,是需要重启服务器的,所以呢,我们不能随意的调整InnoDB缓冲池的大小,而对于InnoDB缓存池,还有一点需要注意的是,很大的缓冲池也会,使的InnoDB在关闭的时候,需要更多的时间把从缓存池刷新到磁盘上;

     

    解析:这个参数配置的缓存池主要适用于MyISAM这种存储引擎的,MyISAM存储引擎只会缓存索引,数据则是依赖操作系统的缓存,所以如果我们系统中存在很多的MyISAM表的话,给操作系统预留的内存中,还要包括缓存MyISAM表数据这一部分内存。

    同InnoDB缓存池一样,超过这个数据量大小的缓存池的配置也是没有必要的。

    我们可以通过下面的查询:

    来知道MyISAM表索引所占用空间大小,这里面有一点要注意的就是,就算是我们系统中使用的全都是InnoDB表,也还是要为分配一定的空间,就是因为MySQL系统表目前还在使用MyISAM存储引擎。

     

    展开全文
  • 有关内存的常用配置参数

    千次阅读 2021-03-14 00:08:19
    几个非常常用的内存配置参数:-XmsJVM启动时申请的初始Heap值(堆),默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定...

    几个非常常用的内存配置参数:

    1c415da7a8083cbcc6ecd9ba97773d9e.png

    -Xms

    JVM启动时申请的初始Heap值(堆),默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同值,避免每次垃圾回收完成后JVM重新分配内存,也可以减少垃圾回收次数;开发测试机JVM可以保留默认值。(例如:-Xms4g)。

    -Xmx

    JVM可申请的最大Heap值(堆),默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列。最佳设值应该视物理内存大小及计算机内其他内存开销而定。(例如:-Xmx4g)

    看个例子,做个对比试验,-Xms和-Xmx设为不同和相同值,用代码对比一下,看看回收次数的变化:

    先给jvm这么一个配置:-Xms5M -Xmx20M -XX:+PrintGCDetails -XX:+UseSerialGC

    解释:1.-XX:+PrintGCDetails:配置垃圾回收日志,让其在控制台中显示出来,2.-XX:+UseSerialGC(串行垃圾回收器,默认,可以不配置)

    总结:减少垃圾回收次数的两个方案:1.尽可能的让堆内存区域大,2.让-Xms(堆内存初始值)和-Xmx(堆内存最大值)相等,限制堆内存的这种伸缩变化能力。(伸缩变化能力:比如说如果初始值比较小的话,在new一个对象时,新生代Eden(伊甸园)就容易被填满,一旦被填满就会触发minor gc(垃圾回收),minor gc(垃圾回收)会消耗资源,系统就会变得卡顿)

    public classJvmTest {public static voidmain(String[] args) {byte[] bs = new byte[1*1024*1024];

    System.out.println("分配了1M的内存空间");

    jvmInfo();byte[] bs1 = new byte[4*1024*1024];

    System.out.println("分配了4M的内存空间");

    jvmInfo();

    }public static String toM(longbyteNum) {float num = byteNum/(1024*1024);

    DecimalFormat df= new DecimalFormat("0.00");

    String str=df.format(num);returnstr;

    }public static voidjvmInfo() {//获取配置的最大内存

    long maxMemory =Runtime.getRuntime().maxMemory();

    System.out.println("maxMemory:" + maxMemory + "字节," + toM(maxMemory) + "M");//获取堆空闲的内存大小

    long freeMemory =Runtime.getRuntime().freeMemory();

    System.out.println("freeMemory:" + maxMemory + "字节," + toM(freeMemory) + "M");//获取堆当前使用掉的内存大小

    long totalMemory =Runtime.getRuntime().totalMemory();

    System.out.println("totalMemory:" + maxMemory + "字节," + toM(totalMemory) + "M");

    }

    }

    19854df66957b1754b94dbebdd73583f.png

    解释:[GC [DefNew: 273088K(新生代垃圾回收之前的值) -> 5561K(新生代垃圾回收之后的值)(307200K), 0.0186715 secs] 278084K(堆内存垃圾回收之前的值) -> 10558K(堆内存垃圾回收之后的值)(989888K), 0.0187027 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

    -Xmn (jdk1.4以后将-XX:NewSize和-XX:MaxNewSize合一,因为我们设置他们的时候也建议设置一样大)

    Java HeapYoung区大小(新生代)。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小(相对于HotSpot 类型的虚拟机来说)。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。(例如:-Xmn2g)

    老年代用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代(不是说所有进入老年代的对象都是长寿对象),主要有两种情况:

    1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。

    2、大的数组对象,且数组中无引用外部对象。老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。(这个异常主要看两点:1.堆内存区域是不是太小了,2.程序里是不是有内存泄露)

    -Xss(本地方法栈)

    Java每个线程的Stack大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。(推荐:小系统:-Xss128K,大系统:-Xss256K)

    总结:1.每个服务器的物理内存是有上线的,一个栈对应一个线程,如果线程栈大小设置大了的话,就意味着操作系统创建线程数就不多,线程数不多服务器并发处理就弱,如果大访问量进来,线程数不够,就会造成线程数以外的用户进行排队等待,出现打开网页n久都打不开。2.如果线程栈大小设置小了的话,可以创建会多很多个线程,但是操作系统对一个进程内的线程数还是有限制的,不能无线生成,所以线程栈设置太小也达不到最优。

    -XX:PermSize(方法区)

    持久代(方法区)的初始内存大小。(例如:-XX:PermSize=64m)

    -XX:MaxPermSize(方法区)

    持久代(方法区)的最大内存大小。(例如:-XX:MaxPermSize=512m)

    -XX:+MaxTenuringThreshold=10(方法区)

    垃圾的最大年龄,代表对象在Survivor区经过10次复制以后才进入老年代。如果设置为0,则年轻代对象不经过Survivor区,直接进入老年代。

    注意:tomcat中的配置内存参数可以放在 catalina.sh(Linux)或者catalina.bat(Windows)的第二行:

    set JAVA_OPTS=%JAVA_OPTS% -server -Xms1800m -Xmx1800m -Xmn600m -XX:PermSize=512M -XX:MaxPermSize=512m -Xss128K -XX:+PrintGCDetails

    补充:catalina.sh(Linux)或者catalina.bat(Windows)配置文件中的rem是注释的意思

    总结:JVM参数配置优化上面,没有一个固定的值,一般都是通过具体的情况去做具体的分析。可以通过压力测试软件,通过压力测试的参数和报出的异常信息来去修改JVM参数配置,不同的程序,不同的访问量配置的都不同。

    展开全文
  • 这是对JVM内存有关的一点小笔记,希望对大家有帮助,存在不足与错误的地方,请大家多多包涵,多多指教。java
  • 主要介绍了简述iOS属性中的内存管理参数相关资料,需要的朋友可以参考下
  • 内容索引:VC/C++源码,系统相关,内存 VC++ 获取物理内存参数一例,获取本地电脑的内存使用率、总物理内存大孝物理内存可用数、页文件总数、虚拟内存总数、虚拟内存可用数等。
  • JVM的内存配置参数

    2018-03-30 11:06:49
    JVM分两块:PermanentSapce和HeapSpace,HeapSpace = 【old + new{=Eden,from,to}】PermantSpace主要负责存放加载Class类级别的class本身,method,field等反射对象,一般不用配置,JVM的Heap区可以通过-X参数来...
  • 三星内存铭牌详解|三星内存条标签内存参数详解 大多数朋友都清楚内存铭牌上,记录着内存的重要数据。但是大多数朋友都对此不甚了然!为此小编也想学习下,现在把相关的学习笔记分享出来,希望和朋友们显摆下,小编...
  • Java JVM(一):内存结构:包括PC寄存器,JVM 方法栈,本地方法栈,JVM堆,JVM方法区
  • PostgreSQL 内存参数调优

    千次阅读 2020-12-26 20:29:07
    本文讨论PostgreSQL中一些...本文对GUC参数内存管理相关参数进行说明,用于提升数据库服务器的性能。所有这些参数位于数据库服务器配置管理文件postgresql.conf中($PDATA目录中)。主要包括下面四个参数。 Shared_bu
  • Solaris系统平台Oracle数据库内存及其相关参数的使用原则.pdf
  • 1.何为内存模块 (Memory Module)?...为Serial Presence Detect 的缩写,它是烧录在EEPROM内的码,以往开机时BIOS必须侦测memory,但有了SPD就不必再去作侦测的动作,而由BIOS直接读取 SPD取得内存相关资料。
  • JVM按照其存储数据的内容将所需内存分配为堆区与非堆区两个部分。 所谓堆区即为通过new的方式创建的对象(类实例)所占用的内存空间;非堆区即为代码、常量、外部访问(如文件访问流所占资源)等。 java垃圾回收器...
  • tomcat内存配置及配置参数详解

    千次阅读 2018-05-08 19:56:06
    1、jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存  按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆...
  • 超频技术之内存“时序”重要参数设置解说互联网 发布时间:2009-04-21 01:17:32 作者:佚名 我要评论相信大多数超频帖子里都会提到内存时序调整,也就是我们经常看到的5-5-5-15 1T、4-5-4-12 2T等等,那么这些参数都...
  • (1)kernel.shmmax:该参数定义了共享内存段的最大尺寸(以字节为单位)。Linux 2.4/2.6缺省为32M,对于oracle来说,该缺省值太低了,通常将其设置为和实际内存一样大即可。 (2)kernel.shmmni:这个内核参数用于...
  • JVM常用内存参数配置

    万次阅读 多人点赞 2017-11-08 09:55:22
    一、 常用参数  -Xms   JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定这个比列。...
  • Oracle10、11、12G 数据库内存推荐计算,参数+公式。Excel附带详细说明推荐内存比例,计算公式以及执行命令和重启的命令。 相关系数调整后,自动变更修改数据库内存的Sql语句,快速修改重启。 注意文档中红字说明!...
  • linux malloc内存申请相关参数设置

    千次阅读 2020-04-23 21:58:35
    malloc小于128k的内存时使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系),...
  • JVM参数调优(内存溢出解决办法)

    千次阅读 2018-02-25 23:46:22
    JVM参数调优(内存溢出解决办法) 设置堆内存大小 错误原因: java.lang.OutOfMemoryError: Java heap space 堆内存溢出 解决办法: 设置堆内存大小: -Xms10m -Xmx10m -XX:+...
  • mysql配置参数调优(8GB内存和64GB内存)

    千次阅读 2019-09-11 22:33:26
    文章目录一、前言二、查看服务器的CPU和内存1、查看CPU的个数2、查看服务器的内存3、数据库版本三、64GB内存的mysql配置参数四、本机8GB内存的mysql配置参数1、查看数据库版本2、具体的配置参数五、总结1、数据库...
  • 最近正在进行从Spring ...由于之前服务比较少,服务器资源充足,许多服务启动时都未添加JVM参数(遗留问题)。结果就是每个服务启动都占用了1.5G-2G的内存,有些服务的体量根本用不了这么多。那么,在Spring Boot中如
  • 内存延迟参数是否越低越好

    千次阅读 2021-07-29 02:43:20
    早在DDR2时代开始,用户便开始关注内存延迟等参数,而且较高延迟内存也被很多DIY玩家称作“鸡肋”。如今DDR3内存风生水起,但是该规格内存延迟过高更加令用户们嗤之以鼻。笔者从论坛上得知,低延迟在不少用户的心目...
  • 对的,我目前在mapreduce里面遇到的最多的错误也是内存分配出错,所以看到好多hadoop执行脚本里面有好多关于内存参数,虽然是知道和内存分配有关系,但是依然不太清楚其中的原理,查阅相关资料,稍作整理如下: ...
  • 于是就能找到泄漏对象是通过的路径与GC Roots 相关链并导致垃圾收集器无法自动回收它们的。掌握了泄漏对象的类型信息,以及GC Roots引用链的信息,就可以比较准确定位出泄漏代码的位置。 2、内存溢出问题导致 1) ...
  • JDK8 合理设置JVM内存参数

    千次阅读 2019-11-21 12:04:11
    不同java应用对内存要求不同,合适的JVM参数只能通过对每个应用实际运行过程中内存占用数据收集后才能确定。即先设置初值,然后在应用运行过程中收集内存占用数据,最后计算各内存区域的大小。 本文先简单介绍与本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,087,681
精华内容 435,072
关键字:

内存的相关参数