±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn,±¾ÎÄÖ÷ÒªÎ§ÈÆÁËAllocationsÓÃÀ´·ÖÎö¾²Ì¬ÄÚ´æ·ÖÅäÀ´£¬½éÉÜÁËiOS
ÐÔÄÜÓÅ»¯¡£ |
|
Demo App
DemoÊÇÒ»¸ö¼òµ¥µÄͼƬӦÓãºÊ×Ò³Ö»ÓÐÒ»¸ö¼òµ¥µÄÈë¿Ú£»´Î¼¶Ò³Ãæ»á¶ÁÈ¡±¾µØÍ¼Æ¬£¬¼ÓÂ˾µ£¬È»ºó°´ÕÕÆÙ²¼Á÷µÄ·½Ê½ÏÔʾ³öÀ´£»µÚÈý¸öÒ³ÃæÌṩ´óͼÏÔʾ£»

ÔËÐдúÂ룺µã»÷Photos -> ½øÈëmain -> µã»÷Ò»ÕÅͼ£¬½øÈëÏêÇéÒ³
-> PopÖ±µ½»Øµ½µÚÒ»¸öÒ³Ãæ£¬Öظ´Õâ¶Î²Ù×÷£¬´ÓXCodeµÄÄÚ´æÄ£¿é·¢ÏÖÁ½¸öÎÊÌâ¡£
ÄÚ´æ·åÖµ¹ý´ó
Í˳ö½çÃæºó£¬ÄÚ´æÃ»ÓнµµÍ¡£

Statistics
²Ëµ¥À¸Ñ¡ÔñProduct -> Profile£¬È»ºóÑ¡ÔñAllocations£¬ÔËÐÐÏîÄ¿£¬°´ÕÕÄÚ´æìÉýµÄ·¾¶Öظ´²Ù×÷£¬²É¼¯µ½ÄÚ´æÊý¾ÝºóÍ£Ö¹ÔËÐС£
ĬÈÏ¿´µ½µÄÊý¾ÝÊÇStatistics(¾²Ì¬·ÖÎö)£¬µã»÷mark 2¿ÉÒÔ¸ü¸ÄÊý¾Ý·ÖÎöģʽ¡£

ΪÁ˸üºÃµÄ½â¾öÎÊÌ⣬ÓбØÒª½²½âÏÂÕâÀïµÄÄÚ´æÏà¹Ø¸ÅÄ
1.All Heap Allocation ¶ÑÉÏmalloc·ÖÅäµÄÄڴ棬²»°ü¹ýÐéÄâÄÚ´æÇøÓò¡£
2.All Anonymous VM ÄäÃûµÄÐéÄâÄÚ´æÇøÓò¡£ºÎΪÄäÃûÄØ£¿¾ÍÊÇAllocations²»ÖªµÀÊÇÄãÄÄЩ´úÂë´´½¨µÄÄڴ棬Ҳ¾ÍÊÇ˵ÕâÀïµÄÄÚ´æÄãÎÞ·¨Ö±½Ó¿ØÖÆ¡£Ïñmemory
mapped file£¬CALayer back storeµÈ¶¼»á³öÏÖÔÚÕâÀï¡£ÕâÀïµÄÄÚ´æÓÐЩÊÇÄãÐèÒªÓÅ»¯µÄ£¬ÓÐЩ²»ÊÇ¡£
±í¸ñµÄÿһÁеÄÊý¾Ý½âÊÍ£º

ÎÒÃǹ´Ñ¡Ç°ËĸöGraph£¬Í¨¹ýÇúÏßµÄÇ÷ÊÆ£¬²»ÄÑ¿´³öÎÊÌâ¾Í³öÔÚVM CoreImageÉÏ£º
ÎÒÃǵãÒ»ÏÂmark 4£¬½øÈëÏêÇéÒ³£¬È»ºóÑ¡ÔñÒ»¸öÄÚ´æ¶ÔÏóµØÖ·£¬ÔÚÓÒ²àÎÒÃÇ¿ÉÒÔ¿´µ½Õâ¸ö¶ÔÏóÊÇÈçºÎ±»´´½¨µÄ£º

Ë«»÷ÕâÒ»ÐУ¬½øÈë»ã±à½çÃæ£¬¿ÉÒÔ¿´³öÀ´£¬×îºóÄÚ´æÊÇÓÉmmap·ÖÅäµÄ£º

Ò²¿ÉÒÔË«»÷ÓÒ²àStack Trace£¬¿´¿´×Ô¼ºµÄ´úÂë:

Generation
ÀûÓÃGeneration£¬ÎÒÃÇ¿ÉÒÔ¶ÔÄÚ´æµÄÔöÁ¿½øÐзÖÎö£ºÊ±¼ä´ÁBÏà±Èʱ¼ä´ÁAÓÐÄÇЩÄÚ´æÔö¼ÓÁ˶àÉÙ
µã×îÏÂÃæµÄMark Generation»á´´½¨Ò»¸öGeneration£¬²¢ÇÒÔÚͼÐÎÇøÓòÔö¼ÓÒ»¸öСºìÆì¡£

µãStatictis£¬´ÓÏÂÀÁбíÖУ¬Ñ¡ÔñGenerations£¬ÎÒÃǾͿÉÒÔ¿´µ½ÄÚ´æÔöÁ¿Ö÷ÒªÔÚVM:
CoreImageÖУ¬ÕâÀïµÄÿһÐÐÒ²¿ÉÒÔµã»÷²é¿´ÏêÇ飬»òÕßÔÚÓÒ²à²é¿´Õ»£º

Call Tree
°´ÕÕÀàËÆµÄ·½Ê½£¬Õâ´ÎÎÒÃÇÑ¡ÔñCall TreeÀ´Ö±½Ó·ÖÎö´úÂëÊÇÈçºÎ´´½¨ÄÚ´æµÄ£¬¹´Ñ¡Separator
By Thread£¬°´ÕÕÏß³ÌÀ´¶ÔÄÚ´æ½øÐзÖÀࣺ

Tips£º°´×¡Option£¬È»ºóÊó±ê×ó¼üµã»÷ͼÖмýÍ·Ö¸ÏòµÄÈý½Ç¼ýÍ·£¬¿ÉÒÔ¿ì½ÝÕ¹¿ªµ÷ÓÃÕ»¡£
Ò²¿ÉÒÔ¹´Ñ¡£º
1.Invert Call Tree µ¹Öú¯ÊýÕ»
2.Hide System Libraries Òþ²ØÏµÍ³¿â
ÕâÑù£¬ÎÒÃǹýÂ˵ôÁËϵͳ·ûºÅ£¬Í¬Ê±Ò²ÓøüÖ±¹ÛµÄ·½Ê½¿´µ½Á˵÷ÓÃÕ»£º

ÎÒÃÇͬÑù¿ÉÒÔÑ¡ÔñÒ»ÐÐË«»÷£¬È»ºó¿ÉÒÔ½øÈëXCode²é¿´Ô´´úÂë»òÕß»ã±à´úÂ룺
¿ÉÒÔ¿´µ½£¬ÒýÆðÄڴ汬ÔöµÄ¾ÍÊÇÕâ¶Î´úÂë
-
(UIImage *)filterdImage:(UIImage *)originalImage{
CIImage *inputImage = [CIImage imageWithCGImage:originalImage.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIColorMonochrome"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[CIColor colorWithRed:0.9 green:0.88
blue:0.12 alpha:1] forKey:kCIInputColorKey];
[filter setValue:@0.5 forKey:kCIInputIntensityKey];
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *outputImage = filter.outputImage;
CGImageRef image = [context createCGImage:outputImage
fromRect:outputImage.extent];
UIImage * filterImage = [UIImage imageWithCGImage:image];
return filterImage;
}
|
Allocations list
Allocations ListÌṩÁËÒ»ÖÖ¸ü´¿´âµÄ·½Ê½£¬ÈÃÄã¿´µ½ÄÚ´æµÄ·ÖÅäµÄÁÐ±í£¬ÎÒÃÇÒ»°ã»áÑ¡ÔñÄÚ´æ´Ó¸ßµ½µÍ£¬¿´¿´ÊDz»ÊÇÓÐʲôÒâÍâ·ÖÅäµÄ´óÄÚ´æ¿é£º

¿ÉÒÔ¿´µ½£¬ÅÅÃûǰ¼¸µÄÄÚ´æ¿é¶¼ÊÇVM:CoreImage£¬´ÓÃû×ÖÒ²¾Í²»ÄÑ¿´³öÀ´£¬ÕâÊÇͼƬÒýÆðµÄÄÚ´æ¡£
ÎÒÃÇÑ¡ÖÐijһÐУ¬ÔÚÓÒ²à¿ÉÒÔ¿´µ½¾ßÌåµÄµ÷ÓÃÕ»£º

½â¾öÄÚ´æÎÊÌâ
²»¹ÜÊÇÉÏÊöÄÇÖÖ·ÖÎö·½Ê½£¬ÎÒÃǶ¼ºÜÈÝÒ×ÕÒµ½ÎÊÌâ³öÏÖÔÚÕâ¶Î´úÂëÀ

ÄÇô£¬ÎªÊ²Ã´Õâ¶Î´úÂë·ÖÅäÄÚ´æºóûÓÐÊÍ·ÅÄØ£¿Èç¹ûÓÐһЩCoreFoundation»òÕßCoreGraphics¾Ñ飬ºÜÈÝÒ×¾ÍÖªµÀÕâÀïÓ¦¸ÃÊÖ¶¯ÊÍ·ÅÄڴ棬ÕâÀï¼ÙÉèÄã²»ÖªµÀ£¬ÄÇôÔõôÕÒµ½ÔÒòÄØ£¿
¿´¿´Õâ¸öº¯ÊýµÄÎĵµÎĵµ¾ÍÖªµÀÁË£º
-
(nullable CGImageRef)createCGImage:(CIImage
*)image
fromRect:(CGRect)fromRect |
Creates
a Quartz 2D image from a region of a Core Image
image object.
Renders a region of an image into a temporary
buffer using the context, then creates and returns
a Quartz 2D image with the results.
|
You
are responsible for releasing the returned image
when you no longer need it.
|
ËùÒÔ£¬ÔÚ´´½¨º¯Êýºó£¬ÎÒÃǽøÐÐrelease¼´¿É
CGImageRef
image = [context createCGImage:outputImage fromRect:outputImage.extent];
UIImage * filterImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
|
ÔÙ¹Û²ìÄڴ棺

¿ÉÒÔ¿´µ½£¬ÈÔÈ»Óиö·åÖµ£¬ÎÒÃÇµÄÆÙ²¼Á÷½çÃæÆäʵ²¢²»ÐèÒªÍêÕûµÄ´óͼÈû¸øImageView£¬Ò»¸ö±È½Ï³£¼ûµÄÓÅ»¯·½Ê½ÊǶÔͼƬ½øÐÐËõ·Å£¬ÕâÀïÓÐÁ½µãҪעÒâ
1.´óͼµÄËõ·Å²»ÒªÓÃUIGraphicsBeginImageContextWithOptions»òÕßCGBitmapContextCreate£¬ÒòΪµ±Í¼Æ¬ºÜ´óµÄʱºò£¬Õâ¸öº¯ÊýºÜÓпÉÄÜ´´½¨¼¸°ÙMÉõÖÁÉÏGµÄÄڴ棬Ӧ¸ÃÓøüµ×²ãµÄImageIOÏà¹ØµÄAPI
2.¼ÙÈçImageViewµÄ³ß´çÊÇ100*100£¬ÄÇôΪÁ˲»Ó°ÏìÓû§ÌåÑ飬ÄãÓ¦¸ÃËõ·Åµ½100*UIScreem.main.scale
Ëõ·Å¾ÙÀý£º
-
(UIImage *)scaledImageFrom:(NSURL *)imageUrl
width:(CGFloat)width{
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge
CFURLRef)imageUrl, nil);
CFDictionaryRef options = (__bridge CFDictionaryRef)
@{
(id) kCGImageSourceCreateThumbnailWithTransform
: @YES,
(id) kCGImageSourceCreateThumbnailFromImageAlways
: @YES,
(id) kCGImageSourceThumbnailMaxPixelSize : @(width)
};
CGImageRef scaledImageRef = CGImageSourceCreateThumbnailAtIndex(source,
0, options);
UIImage *scaled = [UIImage imageWithCGImage:scaledImageRef];
CGImageRelease(scaledImageRef);
return scaled;
}
|
|