Zor böceklerle uğraşırken acemiler ve büyük inekler arasındaki boşluk nedir?

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.

    Mourinho, Manchester United'ı destekliyor uyluğu hala dünyanın en iyisi! Premier Lig rakibi: Bu pozisyonda Messi
    önceki
    Audi A6L, 155.800'den başlayan 2.0T modeli / GAC Trumpchi GS7 ön satışını başlattı / Almanya, otonom araçlara yollarda izin veriyor Car Totem Evening News
    Sonraki
    Asya Kupası'ndaki en kafa karıştırıcı grubun 9 eleme olasılığı var. Çin takımı ikinci olursa, Hindistan'a dokunma olasılığı yüksektir.
    Fiyat çok yüksek işin özü! 2018'in en çok satan 10 ikinci el arabası
    Hat 5'in güneydeki uzantısı yıl sonunda trafiğe açılacak Mevcut kablo sinyal sistemi aynı anda yükseltilmelidir Önümüzdeki Pazartesi (20th) - 20 Ekim, yoğun tren tıkanıklığı artabilir.
    Ali SRE sistemi, zaman dilimlerinde ve karmaşık ağlarda "Uluslararası El Kırpma Partisi" nin dengeleyicisini garanti eder
    Araç kalite garantisi otomobili gerçekten koruyor mu? Küçük parçaların kırılması umrunda mı?
    Zhao Junzhe, Liaoning Futbol Kulübü'nü tekrar bombaladı: kulüp gerçek şeyler yapmadı ve dürüst insanları uzaklaştırmaya zorladı!
    Dyson saç kurutma makineleri, genç bayanları Dyson elektrikli arabalara ne dersiniz?
    James, Kardeş Qiu'ya ne dedi? Oyundan sonraki bazı ipuçları ilgi çekici!
    3.4 milyonluk küçük bir ülke, iki büyük forvetin yanı sıra dünyanın en iyi iki savunucusu var, Fransa titriyor!
    Manchester United forvet oyuncusu 90 dakika içinde birinci sınıftan daha iyi performans gösterdi! Aktif savunma, Manchester United forvet oyuncuları için iyi bir gelenektir
    Çalışanların seyahat etmesi için akıllı bir yol nasıl oluşturulur? Ali'nin kendi geliştirdiği seyahat eserinin ilk teşhiri
    450.000 / Cadillac XT5 sınırlı sayıda satıştan başlayan yeni BMW 5 Serisi uzun eksenli versiyon ön satışları 359.900'den başlıyor / Volkswagenin sorunlu dizel araç çözümü onaylandı Car Totem Eveni
    To Top