内存参数

Windows中进程的内存结构

落爺英雄遲暮 提交于 2019-11-26 17:39:09
基础知识: 堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称为入栈和出栈。有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Register)。每种变量都有不同的分配方式。先来看下面这段代码: #include <stdio.h> int g1=0, g2=0, g3=0; int main() { static int s1=0, s2=0, s3=0; int v1=0, v2=0, v3=0; //打印出各个变量的内存地址

MySQL配置参数优化

柔情痞子 提交于 2019-11-26 17:12:29
内容略少的菜单 安装MySQL 测试环境介绍 为何要进行参数优化? 具体要复制到my.cnf中的 安装MySQL 请参考网上 测试环境介绍 测试环境为centos7.5 A机器ip:10.0.8.37 B机器ip:10.0.8.243 MySQL版本:5.6.42 为何要进行参数优化? 通过根据服务器目前状况,修改Mysql的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能 具体细节请参考: https://www.cnblogs.com/angryprogrammer/p/6667741.html 具体要复制到my.cnf中的 # 参数优化5.6,同时适用5.7 open_files_limit = 10240 back_log = 600 #在MYSQL暂时停止响应新请求之前,短时间内的多少个请求可以被存在堆栈中。如果系统在短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的监听队列的大小。默认值80。 max_connections = 10000 #MySQL允许最大的进程连接数,如果经常出现Too Many Connections的错误提示,则需要增大此值。默认151 max_connect_errors = 6000 #设置每个主机的连接请求异常中断的最大次数,当超过该次数,MYSQL服务器将禁止host的连接请求

JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)

怎甘沉沦 提交于 2019-11-26 17:04:24
1.背景 2.为什么废弃永久代(PermGen) 3.深入理解元空间(Metaspace) 4.总结 ========正文分割线===== 一、背景 1.1 永久代(PermGen)在哪里? 根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了): 上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域。 关于方法区和永久代: 在HotSpot JVM中,这次讨论的 永久代 ,就是上图的方法区(JVM规范中称为方法区)。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。在其他JVM上不存在永久代。 1.2 JDK8永久代的废弃 JDK8 永久代变化如下图: 1.新生代:Eden+From Survivor+To Survivor 2.老年代:OldGen 3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中) 二、为什么废弃永久代(PermGen) 2.1 官方说明 参照JEP122:http://openjdk.java.net/jeps/122,原文截取: Motivation This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to

memcache和redis的对比

微笑、不失礼 提交于 2019-11-26 16:22:12
1.memcache a.Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。 其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。 b.Memcached的键key一般是字符串,该值不能重复;value可以放入字符串、数组、数值、对象、布尔,二进制数据和图片视频 c.Memcached默认服务端口是11211 1.1 php和memcache的链接 $mem = new Memcache(); $mem->connect("127.0.0.1", 11211); //Memcache::set方法有四个参数,第一个参数是key,第二个参数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间。 $mem->set('test','123',0,60); //Memcache::add方法的作用和Memcache::set方法类似,区别是如果 Memcache::add方法的返回值为false,表示这个key已经存在,而Memcache::set方法则会直接覆写。 $mem->add('test'

Go 参数传递

这一生的挚爱 提交于 2019-11-26 14:03:49
Go参数传递 在面试中,经常会被问起,这门语言的参数传递是值传递还是引用传递,当然,大部分情况下我们都会提前准备,有恃无恐,但还是希望能够精益求精嘛,所以针对Go语言来分析,Go传参是值传递还是引用传递。那首先,我们先来了解什么是值传递,什么是引用传递。 值传递 值传递就是函数传递的是传进来参数的一个副本。换个说法就是函数内部修改传入参数的值是函数外部传入值得一个拷贝,所以你在函数内部对这个值进行修改也不会影响外部该参数的值,的确很难表达,看个案例: package main import "fmt" func modify(a int){ a = 10 } func main(){ a := 20 fmt.Println(a) modify(a) fmt.Println(a) } 输出: 20 20 很直观,参数a在进入函数后并没有被改变,我们还可以看看两个内存地址是否相同 package main import "fmt" func modify(a int){ fmt.Println(&a) a = 10 } func main(){ a := 20 fmt.Println(&a) modify(a) } 输出为: 0xc000052080 0xc000052088 可以看到两个内存地址并不一样,这就对了,可以说明 modify 中的参数a,并不是主函数中的变量a

SQL性能优化(efficacious )

跟風遠走 提交于 2019-11-26 12:46:55
1、优化目标 减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。 降低 CPU 计算 除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标 2、优化方法 一、改变 SQL 执行计划 明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是 改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据 ,以达到 “ 减少 IO 次数 ” 和 “ 降低 CPU 计算 ” 的目标 常见误区 (1)count(1)和count(primary_key) 优于 count(*) X 很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是 count(*) ,他们认为这样性能更好,其实这是一个误区。对于有些场景,这样做可能性能会更差

JVM 参数调优配置

ε祈祈猫儿з 提交于 2019-11-26 03:08:50
在 tomcat 配置文件 tomcat/bin/catalina.sh 中 配置 JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=1024m"。在配置文件第一行进行配置。 -Xms 2048m:设置 JVM初始分配的堆内存 为2048m,若设置与-Xmx不同,每次垃圾回收完成后JVM重新分配内存. -Xmx 4096m:设置 JVM最大可用堆内存 为4096M. -Xss 1024k :设置 每个线程的堆栈大小 为1024K。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右. -XX:PermSize =512m:设置 非堆区初始内存 分配大小为512m,其缩写为permanent size(持久化内存). -XX:MaxPermSize =512m:设置JVM最大允许分配的 非堆内存 最大上限为512m. 注:在配置之前一定要慎重的考虑一下自身软件所需要的非堆区内存大小,因为此处内存是不会被java垃圾回收机制进行处理的地方。并且更加要注意的是

C语言

旧街凉风 提交于 2019-11-26 02:31:56
一、编译链接过程 编译 预处理 删除注释,宏替换,头文件展开,条件编译 编译 词法分析,语法分析,语义分析,符号汇总(生成汇编代码) 汇编 将形成的汇编代码转为二进制代码,形成对应的符号表 链接 合并段表以及符号表的重定位 二、指针和数组 数组和指针的区别和联系 联系 表达式中的数组名就是指针 C语言中把数组下标作为指针的偏移量 ==作为函数参数的数组名等同于指针== 区别 数组名在传参时会退化为指针,指针不会(所以一定不要在函数内部对传参后的数组名进行sizeof大小) 内存中数组是一块连续开辟的空间,指针只占一个指针类型的大小空间(32位为4字节,64位为8字节) 数组可以通过下标直接进行访问,指针需要进行计算间接访问 数组名具有常属性,不能进行++,--操作;指针可以 数组指针和指针数组区别 以 int (*p)[n] 为例,从右往左理解,() 高优先级,先定义一个指针,然后看[],说明这是一个指向数组的指针,最后 int 型。 数组指针(int (*p)[n]) 代表一个指向有n个int类型的数组的指针,也叫行指针 指针数组(int *p[n]) 代表一个有n个int* 指针的数组 区别:数组指针由于是一个指针,所以内存中只消耗一个指针大小的空间;指针数组是一个数组,消耗n个对应类型指针大小的空间。 需要注意的点 sizeof字符串指针大小为对应平台下指针大小

记一次生产数据库&quot;意外&quot;重启的经历

强颜欢笑 提交于 2019-11-25 23:26:52
前言 在一个阳光明媚的下午,电脑右下角传来一片片邮件提醒,同时伴随着微信钉钉的震动,打开一看,应用各种出错,天兔告警,数据库服务器内存爆红,Mysql数据库实例挂掉了。 排查 先交代一下数据库版本: mysql> status -------------- mysql Ver 14.14 Distrib 5.7.22-22, for Linux (x86_64) using 6.2 Connection id: 59568 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.22-22-log Percona Server (GPL), Release 22, Revision f62d93c Protocol version: 10 崩溃故障排除绝不是一项有趣的任务,特别是如果MySQL没有报告崩溃的原因。例如,当MySQL内存不足时。 数据库邮件告警提醒发来的消息: Type: mysql Tags: 生产主库 Host: 172.16.1.66:3306 Level: critical Item: connect Value: down

gopl 底层编程(unsafe包)

筅森魡賤 提交于 2019-11-25 23:22:25
包 unsafe 广泛使用在和操作系统交互的低级包中, 例如 runtime、os、syscall、net 等,但是普通程序是不需要使用它的。 unsafe.Sizeof、Alignof 和 Offsetof 函数 unsafe.Sizeof 报告传递给它的参数在内存中占用的字节(Byte)长度(1Byte=8bit,1个字节是8位),参数可以是任意类型的表达式,但它不会对表达式进行求值。对 Sizeof 的调用会返回一个 uintptr 类型的常量表达式,所以返回的结果可以作为数组类型的长度大小,或者用作计算其他的常量: fmt.Println(unsafe.Sizeof(float64(0))) // "8" fmt.Println(unsafe.Sizeof(uint8(0))) // "1" 函数 Sizeof 仅报告每个数据结构固定部分的内存占用的字节长度。以字符串为例,报告的只是字符串对应的指针的字节长度,而不是字符串内容的长度: func main() { var x string x = "a" fmt.Println(unsafe.Sizeof(x), len(x)) // "16 1" var s []string for i := 0; i < 10000; i++ { s = append(s, "Hello") } x = strings.Join(s,