Alimei'nin tanıtımı: Bir satır kod, çevredeki çocuk ayakkabılarının Xcode bellek patlamasına neden oldu. Sonuna kadar keşfetmeyi seven bir mühendis olarak nasıl ayakta kalabilirsiniz? Gaode'den Taolan çocuk ayakkabıları örnek bir çözüm verdi. Şimdi "kriz sahnesine" birlikte girelim.
Sorun Açıklaması:
Geçtiğimiz haftadan beri iOS geliştiricileri özel bilgisayar kartlarından şikayet ediyor. Bazı dikkatli öğrenciler, Xcode'un yaklaşık 6-7G bellek kullandığını ve bazı Mac'lerin yalnızca 8G belleğe sahip olduğunu, belleğin dolu olduğunu ve donmaya neden olduğunu buldular.
Ve benim gibi sınıf arkadaşlarımın bazı mac'larında 16G bellek var (hırlayan yüz), çünkü yeterli hafıza var ve kartı hissetmedim.
Ancak bu sorun, ekibin geliştirme verimliliğini etkilediği için çözülmesi gerekiyor.
Bellek karşılaştırması:
Banyodan, kıyafet değiştirdikten, tütsü yaktıktan, işlemi öldürdükten ve önbelleği temizledikten sonra sırasıyla ayrı ayrı derlemek için bitişik 812 sürüm kodunu ve 816 sürüm kodunu çekin ve sonuca ulaşın:
812 hata ayıklama sırasında 2G hafızasını kullanır
816, hata ayıklama sırasında 6.8G belleği kullanır
Şikayette bulunun:
Bu verileri kalbimizde kabul etmeyi reddediyoruz. Aşağıdaki gibi 2 nokta var:
Kod belleğe rasgele uygulanıyorsa, bellek patlaması simülatör veya gerçek makine olmalıdır. Xcode değil
Mevcut sürüm 10w kod satırı eklerse (aslında öyle değildir), toplam kod hacmi% 10'dan fazla artmaz, Xcode belleği nasıl iki katına çıkarılabilir?
Bu yüzden bunun Apple'ın potu olduğunu düşünüyoruz, onu taşımıyoruz
Ancak kimin potu olursa olsun, kod veya konfigürasyon tarafından tetiklenmelidir ve analiz devam edecektir.
Analiz yöntemi seçimi:
Önümüzde 2 analiz yöntemi var:
Kodu bulun: ikiye bölünerek, farklı tarihlerin sürümlerini derleyin, soruna neden olan kaydı bulun ve buna hangi değişikliğin neden olduğunu belirleyin
Belleği bulun: Artan belleğin ne olduğunu analiz edin ve artan içeriğe göre sorunu analiz edin.
Yöntem 1'i kullanırsanız, kodu bir kez derlemek 15 dakika sürer.Sorunun belirli bir kod satırından kaynaklandığı varsayılırsa, bir gün süreceği tahmin edilir. Sorun birden çok kod satırının birleşiminden etkileniyorsa, süre daha uzun olacaktır. Ve kodu bulsanız bile, ilkeyi bilmeyebilirsiniz.
Bu yüzden ** Yöntem 2 ** 'yi seçiyorum ve ardından Yöntem 1'e geri dönüyorum
Analiz adımları:
Koşarken buldum:
812 Kod hafızası, kod ilk kez açıldığında 1G içindedir, hafıza derleme ve çalıştırma sırasında 2G'dir ve Xcode kapatıldıktan sonra hafıza açılır.
816 önce 1G içinde kod belleğini açar, 6G belleğini derler ve çalıştırır, Xcode'u kapatır ve ardından 6G belleğini açar
Xcode'u kapatın ve tekrar açın. Xcode şu anda çalışmıyor, bu yüzden tek bir şey yaptığı tahmin ediliyor: önbelleği oku
Önbellek dosyası:
Herkes Xcode'un yeni bir projeyi derlemede yavaş olacağını bilir, ancak ikinci derleme hızlıdır. Bunun nedeni, derleme sonucunu önbellek dosyasına kaydetmesidir. Salt okunur dosyayı ikinci kez derlemek, derleme olmadan doğal olarak daha hızlıdır.
Önbellek dosyası "/ Kullanıcılar / kullanıcı adınız / Library / Developer / Xcode / DerivedData" dizininde saklanır
812 ile 816 arasındaki önbellek dosyası karşılaştırması aşağıdaki gibidir:
Başlangıçta önbellek dosyalarının sayısının aynı olduğu ancak boyut farkının büyük olduğu görülebilir. Yani bir sonraki adım farkı bulmak: Kim büyüyor?
Biraz araştırdıktan sonra, her sınıfın üç dosya oluşturacağını buldum:
.o dosyası: ikili nesne dosyası, söylenecek çok şey yok
.d dosyası: metin dosyası, bu sınıfın bağlı olduğu tüm dosya yollarını kaydedin
.dia dosyası: bilinmeyen ikili dosya, ancak daha da büyüyor
Dia'nın bazı kısımları büyüdü ve bazıları değişmedi. İkili bir araçla açıp okudum ve şaşırdım:
Bu uyarı değil mi
Şikayetim tekrar geliyor:
kim o! dikkat çekmek! ** 4 G'lık bir uyarı yazdı! **
Analiz etmeye devam edin:
Uyarıya tam olarak ne sebep oldu? Binlerce .dia dosyasıyla karşılaşınca kalbim çöktü.
Neyse ki, iletişim kurmak için arkadaşımla temasa geçtim.Bir kod uyarı taraması yaptı ve 816'nın belirli bir kod grubu için 812'den yalnızca 107 daha fazla uyarı olduğunu gördü. Diğer gruplar değişmedi ve bunlar önemli olmayan, araştırılmadıkları için boş olmayan ilgili uyarılar.
Herkesin geri bildirimi takılmadan hemen önce 107 uyarı kodu bulduk ve gönderim kayıtlarını kontrol ettik. Öyle görünüyor. Uyarıyı çözdük, yeniden derledik ve sorun çözüldü.
Sorun çözüldü ama Kalan iki sorun:
Neden 107 uyarı gönderdiniz?
Yalnızca 107 uyarı. Hafıza neden yükselecek? Neden yüzlerce uyarı kaldı?
Soru 1:
Yalnızca bir satır kod 107 uyarıya neden oldu
Geçersiz olmayan ilgili uyarı elmaları için söylenmemiş kurallar aşağıdaki gibidir:
Xcode6, bir işlevin parametresinin zorunlu (boş olmayan) veya isteğe bağlı (boş değer atanabilir) olup olmadığını bildirebildiği için sağlanan yeni işlev, kodu daha titiz hale getirecek ve biz bunu öneriyoruz.
Eski kodla uyumlu: üstbilgi dosyasının tamamında boş olmayan / boş değer atanabilir bildirim yok ve derleme iyi
Yeni kod için yüksek gereksinimler: Koda boş olmayan / boş değer atanabilir bir öğe eklendiği sürece, kalan kod da eklenmelidir, aksi takdirde diğer her arabirim bir uyarı alır
Bu nedenle, bu sefer söz konusu olan kod, 107 işlevli eski bir takım sınıfıdır. Yeni bir kod satırı boş olmayan ekler. Böylece 107 uyarı oluşturuldu
Soru 2:
Örneğin, A B C'nin üç kategorisi vardır.
A.h'nin bir uyarısı vardır ve aşağıdaki bilgiler .dia dosyasında yer alır:
işaretçi boş olabilirse'_Nullable 'ekleyin
işaretçi asla boş olmayacaksa'_Nonnull 'ekleyin
A.m dosyası mutlak yolu
A.h dosyasının mutlak yolu
A.m dosyasının ilk birkaç satırı A.h'ye atıfta bulunur ve bir uyarı vardır
A.h'deki uyarının konumu
Uyarı açıklaması: işaretçi bir boş değer atanabilirlik türü belirticisine sahip değil (_Nonnull, _Nullable veya _Null_unspecified)
İki düzeltme yöntemi:
Kısacası bir uyarı mesajı yaklaşık 1k
B, A'yı ifade ediyorsa, Bnin .dia dosyası, yukarıdaki tüm bilgilerin yanı sıra birden çok Bnin dosya yollarını da içerir, yani Bnin açıklama bilgileri Ayı aşıyor
Başlık dosyasında C, B'yi ve B, A'yı ifade ediyorsa, C'nin açıklama bilgisi B'yi aşıyor
ve bu yüzden
Mühendislikte, 107warning, dia dosyası yaklaşık 130k'dir.
Doğrudan ve dolaylı olarak alıntı yapılan dosya sayısı yaklaşık 2500'dür ve tek bir dosya 130.000'i aşmaktadır. Dosya boyutu yaklaşık 350M'dir.
Ek olarak, simülatörün 2 cpu mimarisi (i386 / x86_64) vardır, 2 dosya oluşturulur ve önbellekte toplanmış bir dgph dosyası bulunur. Ve bellekte yapılandırılan dosyanın kapladığı bellek alanı.
Bu nedenle, 4G'nin bellek kullanımı birkaç kez iki katına çıktıktan sonra anlaşılabilir.
sonuç olarak:
Uyarıları, özellikle de başlık dosyalarındaki uyarıları, birçok yerde alıntılanacak ve aşırı büyük açıklama bilgilerine neden olacak şekilde görmezden gelmeyin.
Başlık dosyasını başlık dosyasında içe aktarmamaya çalışın, bu aşırı referansa neden olacak ve sorunu büyütecektir.
Takip et:
818 sürümü, çekirdekteki tüm boş olmayan sorunları çözdü. Ardından uyarıyı kademeli olarak temizlemek için
Düzeltmeden sonra bellek kullanımı şekilde gösterilmiştir
Not: Bu bir Apple hatası mı? Sanırım bir çukur kazıyorum ve kendimi gömüyorum.
Zor bir hatayla karşılaştığınızda çözümünüz nedir? Değiş tokuş yapmak ve birlikte öğrenmek için yorum alanına bir mesaj bırakmaya hoş geldiniz.