Heap and Perm size

本文详细解析了JVM启动时常用的内存设置参数,包括最小堆内存(-Xms)、最大堆内存(-Xmx)、永久代初始大小(-XX:PermSize)及最大大小(-XX:MaxPermSize),帮助读者更好地理解并配置Java应用的运行环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-Xms256m -Xmx256m -XX:PermSize=256m -XX:MaxPermSize=256m
用多轮迭代策略,修改代码:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <time.h> typedef struct { int node_id; double gain; } HeapItem; typedef struct { int id; int area; } Node; typedef struct { int num_nodes; int* nodes; double cost; int count0; int count1; } HyperEdge; typedef struct EdgeList { int edge_id; struct EdgeList* next; } EdgeList; Node* nodes; HyperEdge* edges; int* part; int* locked; double* gain; int n, m; int area0, area1; int total_area; int amax; double ratio_factor; int L, U; EdgeList** node_edges; int* heap_index; int heap_size; int* heap_node_id; double* heap_gain; int compare_int(const void* a, const void* b) { return (*(int*)a - *(int*)b); } void add_edge_to_node(int node_id, int edge_id) { EdgeList* new_item = (EdgeList*)malloc(sizeof(EdgeList)); new_item->edge_id = edge_id; new_item->next = node_edges[node_id]; node_edges[node_id] = new_item; } void initial_partition() { L = (int)ceil(ratio_factor * total_area - amax); U = (int)floor(ratio_factor * total_area + amax); if (L < 0) L = 0; if (U > total_area) U = total_area; int* perm = (int*)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) perm[i] = i; srand((unsigned int)time(NULL)); for (int i = n - 1; i > 0; i--) { int j = rand() % (i + 1); int temp = perm[i]; perm[i] = perm[j]; perm[j] = temp; } for (int i = 0; i < n; i++) part[i] = 1; area0 = 0; area1 = total_area; for (int i = 0; i < n; i++) { int node_id = perm[i]; if (area0 + nodes[node_id].area <= U) { part[node_id] = 0; area0 += nodes[node_id].area; area1 -= nodes[node_id].area; if (area0 >= L) break; } } if (area0 < L) { for (int i = 0; i < n; i++) { if (part[i] == 1 && area0 + nodes[i].area <= U) { part[i] = 0; area0 += nodes[i].area; area1 -= nodes[i].area; if (area0 >= L) break; } } } free(perm); } void init_edge_counts() { for (int i = 0; i < m; i++) { edges[i].count0 = 0; edges[i].count1 = 0; } for (int i = 0; i < m; i++) { for (int j = 0; j < edges[i].num_nodes; j++) { int node_id = edges[i].nodes[j]; if (part[node_id] == 0) edges[i].count0++; else edges[i].count1++; } } } double compute_cut_cost() { double cost = 0.0; for (极思 for (int i = 0; i < m; i++) { if (edges[i].count0 > 0 && edges[i].count1 > 0) { cost += edges[i].cost; } } return cost; } double compute_gain(int v) { double g = 0.0; int p = part[v]; EdgeList* cur = node_edges[v]; while (cur != NULL) { int e_id = cur->edge_id; HyperEdge* e = &edges[e_id]; int a = (p == 0) ? e->count0 : e->count1; int b = (p == 0) ? e->count1 : e->count0; // 关键修正:正确处理超边状态变化 if (a == 1 && b == 0) { g -= e->cost; // 当前节点是超边中唯一节点,移动会导致超边被切割 } else if (a == 1 && b > 0) { g += e->cost; // 当前节点是超边中唯一在分区的节点,移动会减少切割 } else if (a == 2 && b == 0) { g += e->cost; // 当前节点是超边中两个节点之一,移动会减少切割 } cur = cur->next; } return g; } void heap_swap(int i, int j) { int temp_id = heap_node_id[i]; double temp_gain = heap_gain[i]; heap_node_id[i] = heap_node_id[j]; heap_gain[i] = heap_gain[j]; heap_node_id[j] = temp_id; heap_gain[j] = temp_gain; heap_index[heap_node_id[i]] = i; heap_index[heap_node_id[j]] = j; } void heap_swim(int k) { while (k > 0) { int parent = (k - 1) / 2; if (heap_gain[k] > heap_gain[parent]) { heap_swap(k, parent); k = parent; } else break; } } void heap_sink(int k) { while (2 * k + 1 < heap_size) { int j = 2 * k + 1; if (j + 1 < heap_size && heap_gain[j + 1] > heap_gain[j]) j++; if (heap_gain[j] > heap_gain[k]) { heap_swap(k, j); k = j; } else break; } } void heap_push(int node_id, double gain_val) { heap_node_id[heap_size] = node_id; heap_gain[heap_size] = gain_val; heap_index[node_id] = heap_size; heap_swim(heap_size); heap_size++; } void heap_update(int idx, double new_gain) { double old_gain = heap_gain[idx]; heap_gain[idx] = new_gain; if (new_gain > old_gain) heap_swim(idx); else heap_sink(idx); } HeapItem heap_pop() { HeapItem top; top.node_id = heap_node_id[0]; top.gain = heap_gain[0]; heap_index[top.node_id] = -1; heap_swap(0, heap_size - 1); heap_size--; heap_sink(0); return top; } void fm() { init_edge_counts(); double current_cut = compute_cut_cost(); double best_cut = current_cut; int* best_part = (int*)malloc(n * sizeof(int)); memcpy(best_part, part, n * sizeof(int)); for (int i = 0; i < n; i++) locked[i] = 0; for (int i = 0; i < n; i++) gain[i] = compute_gain(i); heap_size = 0; heap_node_id = (int*)malloc(n * sizeof(int)); heap_gain = (double*)malloc(n * sizeof(double)); heap_index = (int*)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) heap_index[i] = -1; for (int i = 0; i < n; i++) { heap_push(i, gain[i]); } while (heap_size > 0) { HeapItem item = heap_pop(); int v = item.node_id; if (locked[v]) continue; int new_area0 = area0; int new_area1 = area1; if (part[v] == 0) { new_area0 -= nodes[v].area; new_area1 += nodes[v].area; } else { new_area0 += nodes[v].area; new_area1 -= nodes[v].area; } if (new_area0 < L || new_area0 > U) { locked[v] = 1; continue; } int from_part = part[v]; int to_part = 1 - from_part; part[v] = to_part; area0 = new_area0; area1 = new_area1; current_cut -= gain[v]; if (current_cut < best_cut) { best_cut = current_cut; memcpy(best_part, part, n * sizeof(int)); } // 更新所有相关超边的状态 EdgeList* cur = node_edges[v]; while (cur != NULL) { int e_id = cur->edge_id; HyperEdge* e = &edges[e_id]; // 更新超边计数 if (from_part == 0) { e->count0--; e->count1++; } else { e->count0++; e->count1--; } // 更新所有关联节点的增益 for (int j = 0; j < e->num_nodes; j++) { int u = e->nodes[j]; if (u == v || locked[u]) continue; double old_gain = gain[u]; gain[u] = compute_gain(u); int idx = heap_index[u]; if (idx != -1) { heap_update(idx, gain[u]); } } cur = cur->next; } locked[v] = 1; } memcpy(part, best_part, n * sizeof(int)); free(best_part); free(heap_node_id); free(heap_gain); free(heap_index); } void output_partition() { int* part0_nodes = (int*)malloc(n * sizeof(int)); int* part1_nodes = (int*)malloc(n * sizeof(int)); int count0 = 0, count1 = 0; for (int i = 0; i < n; i++) { if (part[i] == 0) part0_nodes[count0++] = i; else part1_nodes[count1++] = i; } if (count0 > 0) qsort(part0_nodes, count0, sizeof(int), compare_int); if (count1 > 0) qsort(part1_nodes, count1, sizeof(int), compare_int); int min0 = (count0 > 0) ? part0_nodes[0] : n + 1; int min1 = (count1 > 0) ? part1_nodes[0] : n + 1; // 确保分区0包含最小ID节点 if (min0 <= min1) { printf("The node ids of the partition 0 are "); for (int i = 0; i < count0; i++) { if (i > 0) printf(", "); printf("%d", part0_nodes[i]); } printf("\nThe node ids of the partition 1 are "); for (int i = 0; i < count1; i++) { if (i > 0) printf(", "); printf("%d", part1_nodes[i]); } } else { printf("The node ids of the partition 0 are "); for (int i = 0; i < count1; i++) { if (i > 0) printf(", "); printf("%d", part1_nodes[i]); } printf("\nThe node ids of the partition 1 are "); for (int i = 0; i < count0; i++) { if (i > 0) printf(", "); printf("%d", part0_nodes[i]); } } printf("\n"); init_edge_counts(); double cut_cost = compute_cut_cost(); // 处理浮点数精度问题 if (fabs(cut_cost - round(cut_cost)) < 1e-6) { printf("The total cut cost is %d\n", (int)round(cut_cost)); } else { printf("The total cut cost is %.1f\n", cut_cost); } free(part0_nodes); free(part1_nodes); } int main() { printf("Please enter the number of nodes: "); scanf("%d", &n); nodes = (Node*)malloc(n * sizeof(Node)); part = (int*)malloc(n * sizeof(int)); locked = (int*)malloc(n * sizeof(int)); gain = (double*)malloc(n * sizeof(double)); node_edges = (EdgeList**)malloc(n * sizeof(EdgeList*)); for (int i = 0; i < n; i++) node_edges[i] = NULL; printf("Please enter each of the %d nodes with its id and the node area:\n", n); total_area = 0; amax = 0; for (int i = 0; i < n; i++) { int id, area; scanf("%d %d", &id, &area); nodes[i].id = id; nodes[i].area = area; total_area += area; if (area > amax) amax = area; } printf("Please enter the number of edges: "); scanf("%d", &m); edges = (HyperEdge*)malloc(m * sizeof(HyperEdge)); for (int i = 0; i < m; i++) { int k; scanf("%d", &k); edges[i].num_nodes = k; edges[i].nodes = (int*)malloc(k * sizeof(int)); for (int j = 0; j < k; j++) { int node_id; scanf("%d", &node_id); edges[i].nodes[j] = node_id; add_edge_to_node(node_id, i); } double cost; scanf("%lf", &cost); edges[i].cost = cost; } printf("Please enter the percentage of the ratio factor: "); double percent; scanf("%lf", &percent); ratio_factor = percent / 100.0; initial_partition(); fm(); output_partition(); // 清理内存 for (int i = 0; i < m; i++) free(edges[i].nodes); free(edges); for (int i = 0; i < n; i++) { EdgeList* cur = node_edges[i]; while (cur != NULL) { EdgeList* temp = cur; cur = cur->next; free(temp); } } free(node_edges); free(nodes); free(part); free(locked); free(gain); return 0; }
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值