ນີ້ແມ່ນເຄື່ອງບັນທຶກຄໍາສັ່ງທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນຫຼາຍໆບ່ອນເຮັດວຽກອອນໄລນ໌ຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
memusage - ການນໍາໃຊ້ຄວາມຊົງຈໍາ profile ຂອງໂຄງການ
ສະຫຼຸບສັງລວມ
memusage [ທາງເລືອກ] ... ໂຄງການ [ໂປຣແກມ] ...
ລາຍລະອຽດ
memusage ເປັນສະຄິບ bash ທີ່ໂປຣໄຟລ໌ການນໍາໃຊ້ຫນ່ວຍຄວາມຈໍາຂອງໂຄງການ, ໂຄງການທີ່ຢູ່ ມັນ
preloads ໄດ້ libmemusage.so ຫ້ອງສະຫມຸດເຂົ້າໄປໃນສະພາບແວດລ້ອມຂອງຜູ້ໂທ (ຜ່ານ LD_PRELOAD
ສະພາບແວດລ້ອມປ່ຽນແປງ; ເບິ່ງ ດັ່ງນັ້ນ(8)). ໄດ້ libmemusage.so ຫ້ອງສະຫມຸດຕິດຕາມການຈັດສັນຫນ່ວຍຄວາມຈໍາ
ໂດຍການຂັດຂວາງການໂທໄປຫາ ສູນການຄ້າ(3) ໂທກ(3) ຟຣີ(3) ແລະ realloc(3); ທາງເລືອກ, ໂທ
to ແຜນທີ່(2) mremap(2) ແລະ ແຜນທີ່(2) ຍັງສາມາດຂັດຂວາງໄດ້.
memusage ສາມາດອອກຂໍ້ມູນທີ່ເກັບກໍາຂໍ້ມູນໃນຮູບແບບຂໍ້ຄວາມ, ຫຼືມັນສາມາດນໍາໃຊ້ memusagestat(1) (ເບິ່ງ
ໄດ້ -p ທາງເລືອກ, ຂ້າງລຸ່ມນີ້) ເພື່ອສ້າງໄຟລ໌ PNG ທີ່ມີຮູບພາບຕົວແທນຂອງ
ເກັບກໍາຂໍ້ມູນ.
ຫນ່ວຍຄວາມຈໍາ ການນໍາໃຊ້ ສະຫຼຸບສັງລວມ
ເສັ້ນ "ສະຫຼຸບການນໍາໃຊ້ຫນ່ວຍຄວາມຈໍາ" ອອກໂດຍ memusage ປະກອບມີສາມຊ່ອງຂໍ້ມູນ:
ຂີ້ເຫຍື້ອ ຈໍານວນທັງຫມົດ
ລວມຂອງ ຂະຫນາດ ການໂຕ້ຖຽງຂອງທັງຫມົດ ສູນການຄ້າ(3) ໂທ, ຜະລິດຕະພັນຂອງການໂຕ້ຖຽງ
(nmemb*ຂະຫນາດ) ຂອງທັງ ໝົດ ໂທກ(3) ໂທ, ແລະຜົນລວມຂອງ ຄວາມຍາວ ການໂຕ້ຖຽງຂອງທັງຫມົດ ແຜນທີ່(2)
ໂທ. ໃນກໍລະນີຂອງ realloc(3) ແລະ mremap(2), ຖ້າຂະຫນາດໃຫມ່ຂອງ an
ການຈັດສັນແມ່ນໃຫຍ່ກວ່າຂະຫນາດທີ່ຜ່ານມາ, ຜົນລວມຂອງຄວາມແຕກຕ່າງດັ່ງກ່າວທັງຫມົດ
(ຂະຫນາດໃຫມ່ລົບຂະຫນາດເກົ່າ) ຖືກເພີ່ມ.
ຂີ້ເຫຍື້ອ ຈຸດສູງ
ສູງສຸດທັງໝົດ ຂະຫນາດ ການໂຕ້ຖຽງຂອງ ສູນການຄ້າ(3), ຜະລິດຕະພັນທັງຫມົດຂອງ nmemb*ຂະຫນາດ of
ໂທກ(3), ທັງຫມົດ ຂະຫນາດ ການໂຕ້ຖຽງຂອງ realloc(3) ຄວາມຍາວ ການໂຕ້ຖຽງຂອງ ແຜນທີ່(2) ແລະ
new_size ການໂຕ້ຖຽງຂອງ mremap(2).
stack ຈຸດສູງ
ກ່ອນທີ່ຈະໂທຫາຄັ້ງທໍາອິດກັບຫນ້າທີ່ຕິດຕາມໃດໆ, ທີ່ຢູ່ stack pointer
(ຕົວຊີ້ຖານ stack) ຖືກບັນທຶກໄວ້. ຫຼັງຈາກການໂທແຕ່ລະຫນ້າທີ່, stack ຕົວຈິງ
ທີ່ຢູ່ຕົວຊີ້ຖືກອ່ານແລະຄວາມແຕກຕ່າງຈາກຕົວຊີ້ stack ພື້ນຖານ
ຄິດໄລ່. ສູງສຸດຂອງຄວາມແຕກຕ່າງເຫຼົ່ານີ້ແມ່ນຫຼັງຈາກນັ້ນສູງສຸດ stack.
ທັນທີປະຕິບັດຕາມເສັ້ນສະຫຼຸບນີ້, ຕາຕະລາງສະແດງໃຫ້ເຫັນການໂທຈໍານວນ, ຫນ່ວຍຄວາມຈໍາທັງຫມົດ
ການຈັດສັນຫຼືການຈັດສັນ, ແລະຈໍານວນການໂທທີ່ລົ້ມເຫລວສໍາລັບແຕ່ລະຫນ້າທີ່ຂັດຂວາງ. ສໍາລັບ
realloc(3) ແລະ mremap(2), ພາກສະຫນາມເພີ່ມເຕີມ "nome" ສະແດງໃຫ້ເຫັນການຈັດສັນທີ່ມີການປ່ຽນແປງ
ທີ່ຢູ່ຂອງຕັນ, ແລະພາກສະຫນາມ "dec" ເພີ່ມເຕີມສະແດງໃຫ້ເຫັນການຈັດສັນທີ່ຫຼຸດລົງ
ຂະຫນາດຂອງຕັນ. ສໍາລັບ realloc(3), ພາກສະຫນາມເພີ່ມເຕີມ "ຟຣີ" ສະແດງໃຫ້ເຫັນການຈັດສັນ
ທີ່ເຮັດໃຫ້ຕັນຖືກປົດປ່ອຍ (ເຊັ່ນ, ຂະຫນາດທີ່ຖືກຈັດສັນແມ່ນ 0).
"realloc/total memory" ຂອງຕາຕະລາງຜົນຜະລິດໂດຍ memusage ບໍ່ສະທ້ອນໃຫ້ເຫັນກໍລະນີທີ່
realloc(3) ຖືກນໍາໃຊ້ເພື່ອຈັດສັນພື້ນທີ່ຂອງຫນ່ວຍຄວາມຈໍາໃຫ້ມີຂະຫນາດຂະຫນາດນ້ອຍກວ່າກ່ອນຫນ້ານີ້.
ນີ້ສາມາດເຮັດໃຫ້ຜົນລວມຂອງຈຸລັງ "ຫນ່ວຍຄວາມຈໍາທັງຫມົດ" (ບໍ່ລວມ "ຟຣີ") ມີຂະຫນາດໃຫຍ່ກວ່າ.
ຕາລາງ "ຟຣີ/ຄວາມຈຳທັງໝົດ".
Histogram ສໍາລັບການ block ຂະຫນາດ
"Histogram ສໍາລັບຂະຫນາດຕັນ" ສະຫນອງການແບ່ງສ່ວນການຈັດສັນຫນ່ວຍຄວາມຈໍາເປັນປະເພດຕ່າງໆ
ຂະໜາດຖັງ.
OPTIONS
-n ຊື່, --progname=ຊື່
ຊື່ຂອງໄຟລ໌ໂຄງການກັບໂປຣໄຟລ໌.
-p ເອກະສານ, --png=ເອກະສານ
ສ້າງກາຟິກ PNG ແລະເກັບໄວ້ໃນ ເອກະສານ.
-d ເອກະສານ, --data=ເອກະສານ
ສ້າງໄຟລ໌ຂໍ້ມູນ binary ແລະເກັບໄວ້ໃນ ເອກະສານ.
-u, -- unbuffered
ຢ່າເກັບຜົນຜະລິດ.
-b ຂະຫນາດ, --buffer=ຂະຫນາດ
ເກັບ ຂະຫນາດ ລາຍການກ່ອນທີ່ຈະຂຽນພວກມັນອອກ.
-- ບໍ່ມີໂມງຈັບເວລາ
ປິດການໃຊ້ງານຕາມການຈັບເວລາ (SIGPROF) ການເກັບຕົວຢ່າງຂອງຄ່າຕົວຊີ້ stack.
-m, --mmap
ຍັງຕິດຕາມ ແຜນທີ່(2) mremap(2) ແລະ ແຜນທີ່(2).
-?, - ຊ່ວຍ
ພິມການຊ່ວຍເຫຼືອແລະອອກ.
-- ການນໍາໃຊ້
ພິມຂໍ້ຄວາມການນຳໃຊ້ສັ້ນ ແລະອອກ.
-V, - ການປ່ຽນແປງ
ພິມຂໍ້ມູນສະບັບແລະອອກ.
ທາງເລືອກດັ່ງຕໍ່ໄປນີ້ໃຊ້ໄດ້ພຽງແຕ່ໃນເວລາທີ່ຜະລິດຜົນຜະລິດຮູບພາບ:
-t, -- ອີງຕາມເວລາ
ໃຊ້ເວລາ (ແທນທີ່ຈະເປັນຈໍານວນການເອີ້ນຟັງຊັນ) ເປັນຂະຫນາດສໍາລັບແກນ X.
-T, -- ທັງໝົດ
ນອກຈາກນັ້ນ, ແຕ້ມເສັ້ນສະແດງຂອງການນໍາໃຊ້ຫນ່ວຍຄວາມຈໍາທັງຫມົດ.
--title=ຊື່
ການນໍາໃຊ້ ຊື່ ເປັນຫົວຂໍ້ຂອງກາຟ.
-x ຂະຫນາດ, --x-size=ຂະຫນາດ
ເຮັດກາຟ ຂະຫນາດ pixels ກວ້າງ.
-y ຂະຫນາດ, --y-size=ຂະຫນາດ
ເຮັດກາຟ ຂະຫນາດ pixels ສູງ.
ອອກ STATUS
ສະຖານະການອອກແມ່ນເທົ່າກັບສະຖານະການອອກຂອງໂປແກມ profiled.
EXAMPLE
ຂ້າງລຸ່ມນີ້ແມ່ນໂຄງການທີ່ງ່າຍດາຍທີ່ຈະຈັດສັນພື້ນທີ່ຂອງຄວາມຊົງຈໍາໃນຮອບວຽນທີ່ເພີ່ມຂຶ້ນເຖິງຈຸດສູງສຸດ
ກ່ອນໜ້ານັ້ນ ໝູນວຽນໜ່ວຍຄວາມຈຳໃນທ່ອນໄມ້ນ້ອຍໆທີ່ກັບຄືນສູ່ສູນ.
ຫຼັງຈາກລວບລວມໂຄງການແລະແລ່ນຄໍາສັ່ງຕໍ່ໄປນີ້, ເສັ້ນສະແດງຂອງຫນ່ວຍຄວາມຈໍາ
ການນໍາໃຊ້ໂຄງການສາມາດພົບເຫັນຢູ່ໃນໄຟລ໌ memusage.png:
$ memusage --data=memusage.dat ./a.out
...
ສະຫຼຸບການນຳໃຊ້ໜ່ວຍຄວາມຈຳ: ທັງໝົດ heap: 45200, heap peak: 6440, stack peak: 224
ການໂທທັງຫມົດຫນ່ວຍຄວາມຈໍາທັງຫມົດໂທທີ່ບໍ່ສໍາເລັດ
malloc| 1 400 0
realloc| 40 44800 0 (ຊື່: 40, ເດືອນທັນວາ: 19, ຟຣີ: 0)
calloc| 0 0 0
ຟຣີ| 1 440
Histogram ສໍາລັບຂະຫນາດຕັນ:
192-207 1 2% ================
...
2192-2207 1 2% ================
2240-2255 2 4% =================================
2832-2847 2 4% =================================
3440-3455 2 4% =================================
4032-4047 2 4% =================================
4640-4655 2 4% =================================
5232-5247 2 4% =================================
5840-5855 2 4% =================================
6432-6447 1 2% ================
$ memusagestat memusage.dat memusage.png
ໂຄງການ ແຫຼ່ງ
#ລວມ
# ປະກອບ
#ກໍານົດ CYCLES 20
int
main(int argc, char *argv[])
{
int i, j;
int *p;
printf("malloc: %zd\n", sizeof(int) * 100);
p = malloc(sizeof(int) * 100);
ສໍາລັບ (i = 0; i < CYCLES; i++) {
ຖ້າ (i < CYCLES / 2)
j = i;
ອື່ນ
j--;
printf("realloc: %zd\n", sizeof(int) * (j * 50 + 110));
p = realloc(p, sizeof(int) * (j * 50 + 100));
printf("realloc: %zd\n", sizeof(int) * ((j+1) * 150 + 110));
p = realloc(p, sizeof(int) * ((j + 1) * 150 + 110));
}
ຟຣີ(p);
ອອກ(EXIT_SUCCESS);
}
ໃຊ້ memusage ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net