最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java垃圾回收機制以及內(nèi)存泄漏

 更新時間:2016年05月31日 16:43:56   投稿:jingxian  
下面小編就為大家?guī)硪黄钊肜斫釰ava垃圾回收機制以及內(nèi)存泄漏。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給的大家做個參考。一起跟隨小編過來看看吧

前言

在segmentfault上看到一個問題:java有完善的GC機制,那么在java中是否會出現(xiàn)內(nèi)存泄漏的問題,以及能否給出一個內(nèi)存泄漏的案例。本問題視圖給出此問題的完整答案。

垃圾回收機制簡介

在程序運行過程中,每創(chuàng)建一個對象都會被分配一定的內(nèi)存用以存儲對象數(shù)據(jù)。如果只是不停的分配內(nèi)存,那么程序遲早面臨內(nèi)存不足的問題。所以在任何語言中,都會有一個內(nèi)存回收機制來釋放過期對象的內(nèi)存,以保證內(nèi)存能夠被重復(fù)利用。

內(nèi)存回收機制按照實現(xiàn)角色的不同可以分為兩種,一種是程序員手動實現(xiàn)內(nèi)存的釋放(比如C語言)另一種則是語言內(nèi)建的內(nèi)存回收機制比如本文將要介紹的java垃圾回收機制。

Java的垃圾回收機制

在程序的運行時環(huán)境中,java虛擬機提供了一個系統(tǒng)級的垃圾回收(GC,Carbage Collection)線程,它負(fù)責(zé)回收失去引用的對象占用的內(nèi)存。理解GC的前提是理解一些和垃圾回收相關(guān)的概念,下文一一介紹這些概念。

對象在jvm堆區(qū)的狀態(tài)

Java對象的實例存儲在jvm的堆區(qū),對于GC線程來說,這些對象有三種狀態(tài)。

1. 可觸及狀態(tài):程序中還有變量引用,那么此對象為可觸及狀態(tài)。

2. 可復(fù)活狀態(tài):當(dāng)程序中已經(jīng)沒有變量引用這個對象,那么此對象由可觸及狀態(tài)轉(zhuǎn)為可復(fù)活狀態(tài)。CG線程將在一定的時間準(zhǔn)備調(diào)用此對象的finalize方法(finalize方法繼承或重寫子Object),finalize方法內(nèi)的代碼有可能將對象轉(zhuǎn)為可觸及狀態(tài),否則對象轉(zhuǎn)化為不可觸及狀態(tài)。

3. 不可觸及狀態(tài):只有當(dāng)對象處于不可觸及狀態(tài)時,GC線程才能回收此對象的內(nèi)存。

GC為了能夠正確釋放對象,必須監(jiān)控每一個對象的運行狀態(tài),包括對象的申請、引用、被引用、賦值等,GC都需要進行監(jiān)控,所以無論一個對象處于上文中的任何狀態(tài)GC都會知道。

上文說到,GC線程會在一定的時間執(zhí)行可復(fù)活狀態(tài)對象的finalize方法,那么何時執(zhí)行呢?由于不同的JVM實現(xiàn)者可能使用不同的算法管理GC,所以在任何時候,開發(fā)者無法預(yù)料GC線程進行各項操作(包括檢測對象狀態(tài)、釋放對象內(nèi)存、調(diào)用對象的finalize方法)的時機。雖然可以通過System.gc()和Runtime.gc()函數(shù)提醒GC線程盡快進行垃圾回收操作,但是這也無法保證GC線程馬上就會進行相應(yīng)的回收操作。

內(nèi)存泄露

內(nèi)存泄漏指由于錯誤的設(shè)計造成程序未能釋放已經(jīng)不再使用的內(nèi)存,造成資源浪費。GC會自動清理失去引用的對象所占用的內(nèi)存。但是,由于程序設(shè)計錯誤而導(dǎo)致某些對象始終被引用,那么將會出現(xiàn)內(nèi)存泄漏。

比如下面的例子。使用數(shù)組實現(xiàn)了一個棧,有入棧和出棧兩個操作。

 

import com.sun.javafx.collections.ElementObservableListDecorator;
import com.sun.swing.internal.plaf.metal.resources.metal_sv;

import java.beans.ExceptionListener;
import java.util.EmptyStackException;

/**
 * Created by peng on 14-9-21.
 */
public class MyStack {
  private Object[] elements;
  private int Increment = 10;
  private int size = 0;

  public MyStack(int size) {
    elements = new Object[size];
  }

  //入棧
  public void push(Object o) {
    capacity();
    elements[size++] = o;
  }

  //出棧
  public Object pop() {
    if (size == 0)
      throw new EmptyStackException();
    return elements[--size];
  }

  //增加棧的容量
  private void capacity() {
    if (elements.length != size)
      return;
    Object[] newArray = new Object[elements.length + Increment];
    System.arraycopy(elements, 0, newArray, 0, size);
  }

  public static void main(String[] args) {
    MyStack stack = new MyStack(100);
    for (int i = 0; i < 100; i++)
      stack.push(new Integer(i));
    for (int i = 0; i < 100; i++) {
      System.out.println(stack.pop().toString());
    }
  }
}

這個程序是可用的,支持常用的入棧和出棧操作。但是,有一個問題沒有處理好,就是當(dāng)出棧操作的時候,并沒有釋放數(shù)組中出棧元素的引用,這導(dǎo)致程序?qū)⒁恢北3謱@個Object的引用(此object由數(shù)組引用),GC永遠認(rèn)為此對象是可觸及的,也就更加談不上釋放其內(nèi)存了。這就是內(nèi)存泄漏的一個典型案例。針對此,修改后的代碼為:

//出棧
  public Object pop() {
    if (size == 0)
      throw new EmptyStackException();
    Object o = elements[--size];
    elements[size] = null;
    return o;
  }

以上這篇深入理解Java垃圾回收機制以及內(nèi)存泄漏就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot下Mybatis的緩存的實現(xiàn)步驟

    SpringBoot下Mybatis的緩存的實現(xiàn)步驟

    這篇文章主要介紹了SpringBoot下Mybatis的緩存的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • mapper.xml無法解析字段的問題

    mapper.xml無法解析字段的問題

    這篇文章主要介紹了mapper.xml無法解析字段的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 一文理解kafka?rebalance負(fù)載均衡

    一文理解kafka?rebalance負(fù)載均衡

    這篇文章主要為大家介紹了kafka?rebalance負(fù)載均衡的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • SpringBoot開啟異步調(diào)用方法

    SpringBoot開啟異步調(diào)用方法

    這篇文章主要為大家詳細(xì)介紹了SpringBoot開啟異步調(diào)用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java @Pointcut注解表達式案例詳解

    Java @Pointcut注解表達式案例詳解

    這篇文章主要介紹了Java @Pointcut注解表達式案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java實現(xiàn)簡單小畫板

    Java實現(xiàn)簡單小畫板

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡單小畫板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • SpringMVC @NotNull校驗不生效的解決方案

    SpringMVC @NotNull校驗不生效的解決方案

    這篇文章主要介紹了SpringMVC @NotNull校驗不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 深入理解與應(yīng)用Java抽象類

    深入理解與應(yīng)用Java抽象類

    Java抽象類是一個非常重要的概念,它允許我們定義包含抽象方法和非抽象方法的類,并為子類提供通用的屬性和方法,本文給大家介紹Java抽象類的理解與應(yīng)用,感興趣的朋友一起看看吧
    2025-04-04
  • SpringMVC之RequestContextHolder詳細(xì)解析

    SpringMVC之RequestContextHolder詳細(xì)解析

    這篇文章主要介紹了SpringMVC之RequestContextHolder詳細(xì)解析,正常來說在service層是沒有request的,然而直接從controlller傳過來的話解決方法太粗暴,后來發(fā)現(xiàn)了SpringMVC提供的RequestContextHolder,需要的朋友可以參考下
    2023-11-11
  • idea更改項目(模塊)JDK版本的操作步驟

    idea更改項目(模塊)JDK版本的操作步驟

    idea很多地方都設(shè)置了jdk版本,不同模塊的jdk版本也可能不一樣,下面這篇文章主要給大家介紹了關(guān)于idea更改項目(模塊)JDK版本的操作步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11

最新評論

阿瓦提县| 叙永县| 洞头县| 北川| 水富县| 毕节市| 尤溪县| 方山县| 宁武县| 进贤县| 于田县| 嵊州市| 江川县| 渭南市| 克什克腾旗| 泰和县| 织金县| 旺苍县| 怀柔区| 曲周县| 张北县| 宝山区| 漳浦县| 佛坪县| 佛学| 醴陵市| 松江区| 汪清县| 河间市| 清新县| 县级市| 磐安县| 乌苏市| 勐海县| 郸城县| 福鼎市| 绍兴县| 毕节市| 资兴市| 蚌埠市| 天等县|