簡體   English   中英

Java 8和垃圾回收

[英]Java 8 and Garbage Collection

我有一個關於Java 8和垃圾收集的問題,我們有一個曾經在Java 6上運行的應用程序有問題,現在沒有問題,現在我們在間歇打印時遇到了問題,主機發送給應用程序Print消息,並且它們在大多數情況下都有效但是,基於日志的時間看起來像是打印機消息發送到PrintSystem類(作為單獨的線程運行)時沒有響應。 在閱讀有關GC和強弱引用的內容時,似乎PrintSystem發送消息的方式是這樣的

。PrintSystem.getInstance()printMessage(消息);

因此,由於Java 6和8之間的差異,Java 8是否有可能在GC's PrintSystem線程? 另外,代碼已重新編譯為可在Java 8上運行,我想知道是否仍應針對Java 6對其進行編譯,並僅在Java 8上運行(如果有意義)

日志數據 1月7日14:59:38.037 communications.headers.PLMHeader.PLMMessage()INFO userData是25個字節

1月7日14:59:38.038 communications.headers.PLMHeader.PLMMessage()INFO userData是:測試消息

1月7日14:59:38.038 communications.ums.UMSWorker.run()信息UMS Worker有效

1月7日14:59:38.038 communications.ums.UMSWorker.run()INFO收到未經請求的消息...

1月7日14:59:38.038 communications.ums.UMSWorker.run()信息將消息發送到打印系統(從UMSWorker線程發送的PrintSystem響應應該具有100ms的響應)

2019年1月7日15:00:19.365 communications.ums.UMSWorker.setAceNetHeader()INFO數據為:( 下一條消息之前41秒及其無關)

public void printMessage(Object message) throws Exception
{
if (!initialized)
   throw new Exception("DEBUG: Print System not initialized!");
try 
{
 synchronized(this)
 {
  printList.add(message); // LinkedList 
  this.notify();
 }
 LogManager.traceMessage(this,"DEBUG: PrintSystem.PrintMessage()", 
"printList Size : " + printList.size());
}
catch (Exception e)
{
 LogManager.traceMessage(this,"DEBUG: PrintSystem.PrintMessage() ", 
 "Exception : " + e);
}
}

這是等待/循環讀取printList的PrintSystem run()

public void run()
{
Object message = null;
while (true)
{
 try
 {
  synchronized(this)
  {
   this.wait(2500);
  }
}
catch (Exception e) {} 

 while (!printList.isEmpty())
 {
  synchronized(this) 
  {
    message = printList.removeFirst();
  }
  int printed = printPLMMessage((PLMHeader) message);
  PLMHeader ackHeader = generatePrinterAck((PLMHeader) 
  message,printed);
  Communications.getInstance().ack(ackHeader);
 }
}

謝謝

我懷疑這不是GC問題。 我認為這是有缺陷的代碼問題。

該代碼將持有鎖定的東西添加到printList,但是從printList讀取的代碼在讀取時沒有持有該鎖定。 這使得該代碼無法充分同步,因此無法保證讀取線程的printList更新的可見性。

顯然您之前很幸運,並且此代碼是偶然運行的。 升級Java時,您獲得的好處之一就是更好的優化,它可以完成一些有趣的工作,例如弄清楚何時可以延遲更新緩存,何時可以排除必須執行某些代碼,以及何時調用這些優化的決策。必須假設所應用的代碼已充分同步。 如果沒有該代碼,則可以以您不需要的方式應用優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM