1. İki nesnenin hashCode'u aynıysa, eşittir de doğru olmalıdır, değil mi?
Hayır, cevap aşağıdaki kodda:
@Override public int hashCode () { dönüş 1; }İki nesne eşitse doğruysa, hashCode aynı olmalıdır, değil mi?
Bu parça kesinlikle tartışmalı. Görüşme sırasında cevap şudur: Resmi tasarım gereksinimlerine göre kodlarsanız, hashcode eşit olmalıdır. Bununla birlikte, resmi tasarım gerekliliklerine uyulmaması ve hashcode yöntemi yeniden yazılmaması halinde eşitsizlik olacaktır.
2. Java iş parçacığı havuzunu hiç kullandınız mı?
Yürütücüler, iş parçacığı havuzları oluşturmak için dört yöntem sağlar.
El yazısı:
public static void main (String args) { ExecutorService threadPool = Executors.newCachedThreadPool (); threadPool.execute (() - > { for (int i = 0; i < 20; i ++) { System.out.println (Thread.currentThread (). GetName () + ":" + i); } }); threadPool.shutdown (); }İş parçacığı havuzu işlevi
3. Math.round (-2.5) neye eşittir?
Yuvarlandığını düşünmeyin, yuvarladığını sanmayın yuvarlandığını düşünmeyin!
Mantra: +0.5'ten sonra yuvarlayın. Yani sonuç -2.
Bir soru bırakın, Math.round (-2.6) sonucu ve Math.round (2.6) sonucu
4. Nesne yönelimli altı ilke
Her sınıfın kendi yöntemlerine konsantre olmasına izin verin.
Yazılımdaki nesneler (sınıflar, modüller, işlevler vb.) Genişletmeye açık olmalı, ancak değişiklik için kapalı olmalıdır.
Alt sınıf, ana sınıfı genişletebilir, ancak ana sınıfın orijinal işlevini değiştiremez.
Uygulama sınıfını (ayrıntılar) çağırmak yerine arayüzü veya soyut sınıfı (daha yüksek seviye) çağırmalıdır.
Arayüzü, bağımlılığı karşılayan en küçük arayüze bölün ve uygulama sınıfında gereksiz yöntemler olamaz.
Yüksek kohezyon, düşük bağlantı.
5. Statik ve nihai arasındaki fark
6. String s = "merhaba" ve String s = new String ("merhaba"); Fark
String s = new String ("merhaba"); İki nesne veya bir nesne oluşturmak mümkündür. Sabit havuzda bir merhaba dizesi sabiti varsa, yığın içinde yalnızca bir nesne oluşturulur. Sabit havuzda merhaba nesnesi yoksa hem yığın hem de sabit havuzun oluşturulması gerekir.
String s = "merhaba", JVM, dize sabit havuzunda bir "merhaba" dize nesnesi olup olmadığını doğrudan kontrol edecek, yoksa "merhaba" depolamak için bir bellek ayıracak, öyleyse, dizeyi doğrudan depolayacaktır. Sabit havuzdaki adres yığına döndürülür. (Yeni yok, yığın işlemi yok)
7. Başvuru türü kaç bayt kaplar?
Hotspot, 64 bit platformda 8 bayt ve 32 bit platformda 4 bayt kaplar.
8. "(1 < 3)? "A": "b") + 3 + 4` ve `(1 < 3)? "A": "b") + (3 + 4) `fark
System.out.println (((1 < 3)? "A": "b") + 3 + 4); System.out.println (((1 < 3)? "A": "b") + (3 + 4));Konsol:
a34 a78.1 Hangi koşullar altında artı işareti bir dize birleşimi haline gelir?
Yukarıdaki örneğe göre düşünün.
9. Java'daki anahtar seçim yapısı, veri türü verilerini kullanabilir (JDK1.8)
Daha iyi bellek yöntemi:
Temel tipler arasında boole ve kayan nokta tipi + uzun tip uzun yoktur, karşılık gelen bir paketleme tipi yoktur.
Artı String ve enum.
10. "45, 4 ^ 5,, 410 > > 1` ne kadar eşittir
// 0100 ve 0101 = 0100 = 4 System.out.println (45); // 0100 ^ 0101 = 0001 = 1 System.out.println (4 ^ 5); System.out.println (10 > > 1); // Şüpheniz varsa, aşağıdaki operatör önceliğine bakın System.out.println (410 > > 1); 41 54"4 | 5" ne kadar
Cevap: 5
Operatör Önceliği
11. Neden bazı java sınıflarının Serializable arayüzü uygulaması gerekiyor?
Ağ iletimi veya kalıcılığı için
Serileştirme nedir
Bir nesnenin durum bilgisini saklanabilen veya iletilebilen bir forma dönüştürme süreci
Serileştirilebilir arabirimi uygulamaya ek olarak, başka hangi serileştirme yöntemleri
12. JVM çöp imha yöntemi
İşaretle ve süpür algoritması (eski nesil)
Algoritma iki aşamaya ayrılmıştır: "işaretleme" ve "temizleme": ilk olarak geri dönüştürülmesi gereken tüm nesneleri işaretleyin (erişilebilirlik analizi) ve işaretlemeden sonra tüm işaretli nesneleri eşit şekilde temizleyin.
Algoritmanın iki sorunu vardır:
Bu yüzden genellikle "yaşlılık gibi çok fazla çöpün olmadığı alanlarda" kullanılır.
Kopyalama algoritması (yeni nesil)
Algoritmanın özü, kullanılabilir belleği kapasiteye göre eşit büyüklükte iki parçaya bölmektir.Her seferinde sadece bir parça kullanılır.Bu bellek parçası kullanıldığında, kalan nesneler (çöp değil) diğer parçaya kopyalanır ve ardından Kullanılmış bellek alanını bir defada temizleyin.
Avantajlar: Parçalanma problemini dikkate almaya gerek yoktur, yöntem basit ve etkilidir.
Dezavantajlar: ciddi hafıza kaybı.
Yeni nesil modern ticari VM'lerin tümü replikasyon algoritmasını kullanıyor, ancak yeni nesildeki nesnelerin% 98'i son derece kısa yaşam döngülerine sahip olduğundan, yeni neslin alanını tam olarak 1: 1 oranında bölmek değil, yeni nesil alanı bölmek gerekiyor. Daha büyük bir Cennet alanına ve iki daha küçük Survivor alanına bölünmüş (HotSpot varsayılan olarak Eden ve Survivor boyut oranına 8: 1'dir), her seferinde sadece Eden ve Survivor alanlarından biri kullanılır.
MinorGC meydana geldiğinde, Eden ve Survivor'daki hayatta kalan nesneleri bir seferde başka bir Survivor'a kopyalayın ve sonunda Eden ile Survivor arasındaki boşluğu temizleyin. Survivor alanı yeterli olmadığında (hayatta kalan nesneleri kurtarmak için yeterli değil), alan tahsis garanti mekanizması için eski nesile güvenmek gerekir ve belleğin bu kısmı doğrudan eski nesle girer.
Kopyalama algoritması için alan tahsis garantisi:
Minor GC yapmadan önce, VM ilk olarak eski nesilde yeni neslin hayatta kalan nesnelerini depolamak için yeterli alan olup olmadığını kontrol edecek.Yeni nesil kopya toplama algoritmasını kullandığından, bellek kullanımını iyileştirmek için Survivor'lardan yalnızca biri rotasyon yedeklemesi olarak kullanılıyor. Minor GC'den sonra çok sayıda nesne hala hayatta olduğunda, eski neslin garantileri tahsis edilmesi gerekir, böylece Survivor'un barındıramayacağı nesneler doğrudan eski nesle girer, ancak öncül, eski neslin bu hayatta kalan nesneleri barındırmak için yeterli alana sahip olması gerektiğidir.
Ancak, hayatta kalan nesnelerin boyutu, gerçek GC tamamlanmadan önce net bir şekilde bilinemez. Bu nedenle, Küçük GC'den önce, VM ilk olarak eski neslin sürekli alanının yeni nesil nesnelerin toplam boyutundan veya önceki yükseltmelerin ortalama boyutundan daha büyük olup olmadığını kontrol edecektir. Koşullar doğruysa devam edin. Minor GC, aksi takdirde Full GC (eski nesil için daha fazla yer açmak için).
Bununla birlikte, terfi edilen nesnelerin ortalama boyutunun alınması da risklidir.Belirli bir Küçük GC'den sonra nesnelerin sayısı ortalamanın çok üzerinde bir anda artarsa, yine de bir garanti arızasına neden olabilir (Taşıma Promosyon Başarısızlığı, yaşlılık saklanamaz. Bu nesneler), şu anda, başarısızlıktan sonra bir Tam GC'yi yeniden başlatmalıyız (eski nesil için daha fazla yer açmak için).
İşaretleme sıralama algoritması (eski nesil)
İşaret kaldırma algoritması, bellek parçalanma problemleri oluşturacaktır ve kopyalama algoritması ek bellek garanti alanına ihtiyaç duyar, bu nedenle yaşlılığın özelliklerine göre bir işaret sıralama algoritması vardır.İşaret sıralama algoritmasının markalama işlemi, işaret temizleme algoritması ile aynıdır, ancak sonraki adımlar Ardından geri dönüştürülebilir nesneleri doğrudan temizleyin, ancak hayatta kalan tüm nesnelerin bir uca hareket etmesine izin verin ve ardından son sınırın dışındaki belleği temizleyin.
13. Genç, yaşlı ve ısrarcı nesillerde neler saklanır?
Yeni nesil:
İleri yaş:
Kalıcı nesil:
Yöntem alanını ifade eder.
14. Ulaşılabilirlik algoritmasında, GC Roots nesneleri olarak hangi nesneler kullanılabilir?
15. MinGC ve FullGC ne zaman yapılmalı
MinGC:
FullGC:
16. Nesnenin bir çöp nesnesi olduğu nasıl belirlenir
Java dünyasındaki hemen hemen tüm nesne örnekleri yığın içinde depolanır.Çöp toplayıcı öbeği geri istemeden önce, ilk şey hangi nesnelerin ölü (geri dönüştürülebilir) olduğunu belirlemektir.
Referans sayma
JDK1.2'den önce referans sayaç algoritması kullanılıyordu.
Nesneye bir referans sayacı ekleyin Bu nesneye bir referans olduğunda, referans sayacının değeri +1 olacaktır. Referans geçersiz olduğunda sayacın değeri -1 olacaktır. Referans sayacı sıfıra düştüğünde işaretler Bu nesneye artık referans verilmiyor ve geri dönüştürülebilir!
sorun: B sınıfının yöntemi A sınıfında çağrılırsa, A sınıfının yöntemi B sınıfında çağrılır, böylece diğer tüm referanslar ortadan kalktığında, A ve B ortak bir referansa sahip olur, yani iki nesnenin referans sayacı Her biri 1'dir, ancak aslında bu iki nesnenin ek başvuruları yoktur ve anlamsızdır. Ancak algoritma bu tür çöpleri hesaplamaz.
Erişilebilirlik analizi
Yaygın ticari dillerin (Java, C # gibi) genel uygulamasında, erişilebilirlik analizi algoritması, nesnenin canlı olup olmadığını belirlemek için kullanılır: Başlangıç noktası olarak GC Kökleri adı verilen bir dizi nesne kullanılır ve ardından aşağı doğru arama yapılır; Geçilen yola Referans Zinciri denir.Bir nesne herhangi bir referans zinciri olmadan GC Köklerine bağlandığında, nesneye erişilemez, bu da aşağıdaki şekilde gösterildiği gibi nesnenin kullanılamadığı anlamına gelir: E ve F birbiriyle ilişkili olmasına rağmen , Ancak GC Roots'a erişilemezler, bu nedenle geri dönüştürülebilir nesneler olarak da değerlendirilirler.
Not: Nesne erişilebilirlik analizi algoritmasında erişilemez olsa bile, sanal makine onu hemen geri talep etmez, çünkü bir nesneyi gerçekten ölü ilan etmek için en az iki işaretleme sürecinden geçmelidir: ulaşılabilirlik analizinden sonra nesnenin olmadığı ilk kez bulunursa GC Roots'a bağlı referans zinciri, ikinci kez F-Queue yürütme kuyruğundaki nesnelerin GC tarafından küçük ölçekli işaretlenmesidir (nesnenin finalize () yöntemini kapsaması gerekir ve çağrılmamıştır).
17. Birkaç çöp toplayıcı isim verebilir misiniz?
Seri
Seri toplayıcı, İstemci modunda çalışan Hotspot'tur Varsayılan genç nesil toplayıcı , Çöp toplama gerçekleştirirken, tüm iş süreçlerini askıya alacak ve GC çalışmasını tamamlamak için bir iş parçacığı kullanacaktır.
Özellikler: Basit ve verimli, JVM yönetim belleğinin büyük olmadığı durumlar için uygundur (on megabayt ila 100 megabayt).
Parnew
ParNew toplayıcı aslında Serial'ın çok iş parçacıklı bir versiyonudur.Geri dönüşüm stratejisi tamamen aynı, ancak farklılar.
Parnew'in çok iş parçacıklı bir gc koleksiyonu olduğunu, yani çok çekirdekli bir cpu ile daha iyi çalıştığını, bir cpu ise aynı etkiye sahip olacağını söyledik. (GC iş parçacığı sayısı -XX: ParallelGCThreads parametresi ile kontrol edilebilir)
Cms
CMS (Concurrent Mark Sweep) toplayıcı çığır açan bir toplayıcıdır. Gerçek anlamda eşzamanlı toplayıcı Teorik anlamda daha iyi performans gösteren G1 toplayıcıları olmasına rağmen, birden fazla eşzamanlılık ve düşük duraklama ile toplayıcı olarak da bilinen CMS (Taobao gibi), ana akım İnternet şirketleri tarafından hala çevrimiçi olarak kullanılmaktadır.
Mark süpürme algoritmasına dayalı olarak uygulandığı İngilizce kompozisyonundan görülebilir. Tüm süreç 4 adıma bölünmüştür:
İlk işaretleme ve yeniden işaretlemenin STW (dünyayı durdur, yani: kullanıcı dizisini askıya al) işlemini gerektirdiği görülebilir. Çünkü en çok zaman alan işlemler eşzamanlı işaretleme ve eşzamanlı kaldırmadır. Bu nedenle, genel olarak, CMS'nin GC ve kullanıcı iş parçacıklarının aynı anda çalıştığına inanıyoruz.
avantaj: Eşzamanlı toplama, düşük duraklama
Dezavantajları:
G1
Mükemmel CMS çöp toplayıcı gibi, G1 de en küçük gecikmeye odaklanan bir çöp toplayıcıdır ve aynı zamanda büyük boyutlu yığın belleğinin çöp toplama işlemi için de uygundur.Resmi tavsiye, CMS'yi seçmek yerine G1'i kullanmaktır. G1'in en büyük özelliği Bölüm tanıtın Fikirler, Zayıf nesil Her bir çöp toplama döngüsünde kaynakların akılcı kullanımı kavramı, diğer toplayıcıların ve hatta CMS'nin birçok eksikliğini çözer.
Her alan E, S ve O nesillerine sahip olduğu için G1'de, tüm Eden'i ve diğer nesilleri geri almaya gerek yoktur, daha fazla geri dönüştürülebilir nesneler içeren alanlar bulup bunları geri kazanmaya gerek yoktur (STW işlemleri de gerekli olsa da, ancak Yüksek verim sağlamak için harcanan zaman çok azdır.
Senozoik koleksiyon
G1'in yeni nesil koleksiyonu ParNew'e benziyor, eğer hayatta kalma süresi belirli bir eşiği aşarsa, S / O alanına aktarılacaktır.
Genç nesil bellek, bir dizi kesintili yığın alanından oluşur.Bu yöntem, her bir oluşturma alanının boyutunu dinamik olarak ayarlamayı mümkün kılar.
Eski koleksiyon
Aşağıdaki aşamalara ayrılmıştır:
18. JVM'de nesne oluşturma süreci
1. Bellek oluşturma talimatını alın
Sanal makine bir bellek oluşturma talimatıyla (yeni sınıf adı) karşılaştığında, yöntem alanına gelir ve yeni parametreye bağlı olarak sabit havuzda bir sınıf bulmak için bir sembol referansı bulur.
2. Sembol referanslarını kontrol edin
Sembol referansının yüklenip yüklenmediğini, ayrıştırılıp başlatılmadığını kontrol edin, değilse, sınıf yükleme işlemini gerçekleştirin, aksi takdirde doğrudan yeni nesne için bellek ayırmaya hazırlanın
3. Belleği ayırın
Sanal makine nesneler için bellek ayırır (yığın) Bellek ayırmanın iki yolu vardır (işaretçi çarpışması ve serbest liste); bellek ayırmak için eşzamanlılık güvenliğini sağlamanın iki yolu vardır.
3.1. İşaretçi çarpışması
Tüm depolama alanı iki kısma bölünmüştür, bir kısmı boş ve diğer kısmı dolu, alan tahsis edilmesi gerektiğinde, sadece ibre hareketinin uzunluğunun hesaplanması gerekir.
3.2. Ücretsiz liste
Sanal makine boş bir liste tutar ve alan ayırması gerektiğinde, tahsis için ücretsiz listeyi kontrol eder ve boş listeyi günceller.
Bellek ayırma yönteminin java yığınının düzenliliğiyle belirlendiği ve java yığınının düzenliliğinin de çöp toplama mekanizması tarafından belirlendiği görülebilir.
3.2.5 Güvenlik sorunları hakkında düşünme
Bellek ayırma stratejisi işaretçi çarpışması ise, yüksek eşzamanlılık durumunda birden çok nesnenin bellek ayırması gerekiyorsa, işlenmezse, iş parçacığı güvenliği sorunları kesinlikle ortaya çıkacak ve bazı nesnelerin alan ayrılmamasına neden olacaktır.
İşte çözüm:
3.3 İş parçacığı senkronizasyon stratejisi
Yani, iş parçacığı güvenliğini önlemek için her iş parçacığı senkronize edilir.
3.4. Yerel iş parçacığı tahsis tamponu
TLAB (İş Parçacığı Yerel Ayırma Tamponu) olarak da adlandırılır, eşzamanlılık sorunu olmaması için öbekteki her iş parçacığı için küçük bir bağımsız bellek parçası ayrılır.Java düzeyi, ThreadLocal sınıfının uygulanmasına karşılık gelir
4. Başlatma
5. Nesnenin başlatma yöntemini çağırın
Yani inşaat yöntemini uygulamaktır.
Makale kaynağı: Pippi, herhangi bir ihlal varsa, silmek için lütfen iletişime geçin, teşekkür ederim.