C : 如何优化给定 c 程序的内存消耗?
C : How to optimise the memory consumption of the given c program?
我有一个 c 程序,它通过 MQTT 发送每个偶数索引上的数据,发送数据后,框架 json 被清除并开始构建新的并重复该过程。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include <jansson.h>
char *jsonString;
void sendMQTT(char *jsonString){
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
MQTTClient_create(&client, "tcp://localhost:1883", "client-pub",
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
printf("Inside MQTT :: %s\n", jsonString);
pubmsg.payload = jsonString;
pubmsg.payloadlen = (int)strlen(jsonString);
pubmsg.qos = 1;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, "mqtt-ex", &pubmsg, &token);
rc = MQTTClient_waitForCompletion(client, token, 10000L);
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
}
int main() {
json_t *root = json_object();
char myNum[10] = {1, 2, 3, 4, 6, 7, 12, 16, 32, 24};
for(int i=0; i<10;i++)
{
int json_size = json_object_size(root);
if(i%2==0 && json_size !=0)
{
jsonString = json_dumps(root, 0);
sendMQTT(jsonString);
json_object_clear(root);
free(jsonString);
}
char key[8];
snprintf(key, sizeof(key), "%d", myNum[i]);
json_object_set_new( root, key, json_integer(i));
}
}
当我 运行 这个过程大约 2 小时后,空闲内存几乎耗尽,当我连续 运行 读取空闲内存 2 小时后,它结束最多 2 MB。
> show system cpu
Status='0,Success'
TotalMemory='62304256'
FreeMemory='3239936'
CPUUtilization='29'
而在开始上述过程之前,可用内存为 17 MB。如何优化上面给定程序中的内存消耗?
json_dumps
的文档指出
The return value must be freed by the caller using free()
.
由于您从不调用 free(jsonString);
,因此会导致内存泄漏,这可以解释您的内存问题(因为您在循环中调用 json_dumps
)
我有一个 c 程序,它通过 MQTT 发送每个偶数索引上的数据,发送数据后,框架 json 被清除并开始构建新的并重复该过程。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include <jansson.h>
char *jsonString;
void sendMQTT(char *jsonString){
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
MQTTClient_create(&client, "tcp://localhost:1883", "client-pub",
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
printf("Inside MQTT :: %s\n", jsonString);
pubmsg.payload = jsonString;
pubmsg.payloadlen = (int)strlen(jsonString);
pubmsg.qos = 1;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, "mqtt-ex", &pubmsg, &token);
rc = MQTTClient_waitForCompletion(client, token, 10000L);
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
}
int main() {
json_t *root = json_object();
char myNum[10] = {1, 2, 3, 4, 6, 7, 12, 16, 32, 24};
for(int i=0; i<10;i++)
{
int json_size = json_object_size(root);
if(i%2==0 && json_size !=0)
{
jsonString = json_dumps(root, 0);
sendMQTT(jsonString);
json_object_clear(root);
free(jsonString);
}
char key[8];
snprintf(key, sizeof(key), "%d", myNum[i]);
json_object_set_new( root, key, json_integer(i));
}
}
当我 运行 这个过程大约 2 小时后,空闲内存几乎耗尽,当我连续 运行 读取空闲内存 2 小时后,它结束最多 2 MB。
> show system cpu
Status='0,Success'
TotalMemory='62304256'
FreeMemory='3239936'
CPUUtilization='29'
而在开始上述过程之前,可用内存为 17 MB。如何优化上面给定程序中的内存消耗?
json_dumps
的文档指出
The return value must be freed by the caller using
free()
.
由于您从不调用 free(jsonString);
,因此会导致内存泄漏,这可以解释您的内存问题(因为您在循环中调用 json_dumps
)