當通過swebhdfs下載大文件時,java會分配過多的字節數組,並讓它立即變成垃圾。儘管這些是短命的字節數組,但它們會觸發太多的小暫停,從而導致應用程序不可預測。Java SSL太多內存分配
據我明白的問題是CipherBox.decrypt重新使用的輸入和輸出相同的字節陣列到呼叫Cipher.update http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/security/ssl/CipherBox.java#469
大多數密碼實現的,如果在同一數組傳遞給輸入和輸出分配一個新的字節數組並返回它。如果您不使用SSL下載大量數據,這並不重要。在我們的例子中,我們從Hadoop下載TB數據,這會導致很多小的GC暫停。
有沒有人遇到過這個問題?我相信只有不具有此行爲的密碼纔是RSA,但RSA因其他原因而中斷。
很難看到你能做些什麼。您最好的防禦措施是儘可能使用大量的應用程序緩衝區,16-32k(更多是沒有意義的SSL有16k記錄)。你爲什麼使用'DataInputStream.read()'? – EJP
@EJP我寫了一個測試程序來重現這個問題。原始程序沒有使用DataInputStream並且有相同的問題。我相信我可以向java團隊發出一個請求,以公開一個輸出緩衝區可以作爲可選參數傳入的API。 –
沒有人說不使用'DataInputStream'就能解決問題。如果您認爲可以等待兩年或更長時間,則可以提出申請,但會被拒絕。您提供的緩衝區是純文本的:SSL實現需要一個密文緩衝區,並且Java API不提供給您提供該緩衝區的方法,該緩衝區的長度您不知道。 – EJP