2012-02-11 25 views
6

Java'da bir iş parçacığının yığın boyutunu çalışma zamanında elde etmenin bir yolu olmadığını anlıyorum (bkz. Can one obtain actual stack size used by a thread in Java after some time of running?). ÖrneğinYığın gerçek boyutunu elde etmek için neden bir yöntem yok?

, biz * 1024 64 yığın boyutunu belirten bir java.lang.Thread oluşturursanız, JVM herhangi yığın boyutu ile bize bir iplik vermek serbesttir. Bununla birlikte, yığının gerçek boyutunu bilmenin aslında bu tür bir bilgi gerektiren bazı uygulamalar için çok faydalı olduğuna inanıyorum.

Yığın için kullanılan gerçek gerçek bayt sayısını bildiren bir yönteme sahip olmamamızın nedeni nedir?

Mimaride, bir iş parçacığı için gerçek bayt sayısını elde etmeyi imkansız kılan bir çeşit sınırlama var mı?

+1

"Ancak, aslında bu tür bir bilgi gerektiren belirli uygulamalar için yığının gerçek boyutunu bilmenin çok yararlı olduğuna inanıyorum." Hiç örneğin var mı? –

+0

@MarkByers Örneğin, bir web sunucusu veya bir işletim sistemi. – Pacerier

+2

Neden bir web sunucusunun yığın boyutunu bilmesi gerekiyor? – Bombe

cevap

3

Yığında saklanan tek şey ilkel türler ve başvurulardır. Nesneler hep öbek üzerinde oluşturulan, bu nedenle yığın saklanan olacağını veri tipleri

tip byte, char, int, uzun, şamandıranın
  • Yerel Değişkenler etmekte olup, bunlardan çift uzun 8 olan çift bayt nesnelere
  • Kaynaklar 32 bit VM 4 byte 64 bit VM 8 byte depolandıkları böylece dizileri nesneleri tipi vardır

Not (muhtemelen daha kısa, 48 bit referanslar yer kazanmak için kullanılır) Öbek üzerinde, eğer bir sınıftaki bir ilkel varsa, o zaman ilkel bir nesnenin parçasıdır ve bu nedenle öbekte depolanır.

Bu nedenle, pist tekrarı olmadıkça bir iş parçacığı için yığın alanı tükenmek oldukça zordur. Java tasarımcılarının size yığın boyutunu bulmak için bir yol vermemesinin nedeni budur.

Yığın boyutunu vermemek için başka bir neden de, gerçekten hiçbir şey yapamayacağınız bir uygulama ayrıntıları olabileceğidir, iş parçacığını oluşturduktan sonra bir iş parçacığı yığınının boyutunu değiştiremezsiniz. işaretçi aritmetiğini yapamazsınız, böylece yığın boyutunu bilmenin anlamı nedir?

+0

Ben bir iş parçacığı havuzu, ben doğduğunda, her biri 64Kb bir yığın boyutu ile 30 iş parçacığı oluşturmak istiyorum.Ancak JVM yığın boyutu isteğimi yoksayar ve her iş parçacığı 1Mb yığın boyutu ile oluşturur, o zaman ben 30 iş parçacığı oluşturmak istemiyorum. Her iş parçacığı bir yığın boyutu 512Kb ise, bunun yerine 15 iş parçacığı oluşturur. Her bir iş parçacığının 1Mb'lik bir yığın boyutu varsa, bunun yerine 10 iş parçacığı (ve benzeri) oluşturabilirim. Ancak yığın boyutunu sorgulamamın bir yolu yok ve şimdi yapabileceğim en iyi şey varsaymak. – Pacerier

+0

@Pacerier yığın boyutu, yığın boyutuna göre çok küçüktür, bu nedenle daha fazla iş parçacığına sahip olan konu, tek bir iş parçacığının yığın boyutu değil, her iş parçacığı tarafından kullanılan yığın bellek miktarıdır. Daha fazla iş parçacığı muhtemelen daha fazla ihtiyacın olacak. Uygulamanızı çalıştırmak için ne tür bir donanım hedefliyorsunuz? – ams

+0

Bir şeyi yanlış anladım, çünkü iş parçacıkları kendileri tarafından herhangi bir yığın bellek almazlar. 10 adet MyThreadPool örneğim varsa ve her bir MyThreadPool'de 30 iş parçacığı varsa ve her iş parçacığının toplam 300Mb bellek olan 1Mb yığın boyutu vardır. Diğer taraftan, her bir iş parçacığı 64Kb yığın boyutuna sahipse, yalnızca 18.75Mb bellek alır. Ortalamanın üstünde bir bilgisayarla bile büyük bir fark var – Pacerier

İlgili konular