內存泄漏優化

目錄介紹:

  • 1.什么是內存泄漏
  • 2.內存泄漏造成什么影響
  • 3.內存泄漏檢測的工具有哪些
  • 4.關于Leakcanary使用介紹
  • 5.Leakcanary捕捉常見的內存泄漏及解決辦法
    • 5.0.1 錯誤使用單例造成的內存泄漏
    • 5.0.2 錯誤使用靜態變量,導致引用后無法銷毀
    • 5.0.3 [常見]Handler使用不當造成的內存泄漏
    • 5.0.4 線程造成的內存泄漏[比較少見]
    • 5.0.5 非靜態內部類創建靜態實例造成的內存泄漏
    • 5.0.6 不需要用的監聽未移除會發生內存泄露
    • 5.0.7 [常見]資源未關閉造成的內存泄漏
    • 5.0.8 未注銷EventBus導致的內存泄漏
    • 5.0.9 [常見]持有activity引用未被釋放導致內存泄漏
    • 5.1.0 靜態集合使用不當導致的內存泄漏
    • 5.1.1 動畫資源未釋放導致內存泄漏
    • 5.1.2 系統bug之InputMethodManager導致內存泄漏
  • 6.其他建議
    • 6.0.1 盡量避免使用 static 成員變量
  • 7.版本更新
    • v1.0.0 更新于2016年3月19日
    • v1.1.0 更新于2017年7月8日
    • v1.2.0 更新于2018年5月3日
    • v1.3.0 更新于2018年9月18日

1.什么是內存泄漏?

  • 一些對象有著有限的聲明周期,當這些對象所要做的事情完成了,我們希望它們會被垃圾回收器回收掉。但是如果有一系列對這個對象的引用存在,那么在我們期待這個對象生命周期結束時被垃圾回收器回收的時候,它是不會被回收的。它還會占用內存,這就造成了內存泄露。持續累加,內存很快被耗盡。
  • 比如:當Activity的onDestroy()方法被調用后,Activity以及它涉及到的View和相關的Bitmap都應該被回收掉。但是,如果有一個后臺線程持有這個Activity的引用,那么該Activity所占用的內存就不能被回收,這最終將會導致內存耗盡引發OOM而讓應用crash掉。

2.內存泄漏會造成什么影響?

  • 它是造成應用程序OOM的主要原因之一。由于android系統為每個應用程序分配的內存有限,當一個應用中產生的內存泄漏比較多時,就難免會導致應用所需要的內存超過這個系統分配的內存限額,這就

3.內存泄漏檢測的工具有哪些

  • 最常見的是:Leakcanary

4.關于Leakcanary使用介紹

  • leakCanary是Square開源框架,是一個Android和Java的內存泄露檢測庫,如果檢測到某個 activity 有內存泄露,LeakCanary 就是自動地顯示一個通知,所以可以把它理解為傻瓜式的內存泄露檢測工具。通過它可以大幅度減少開發中遇到的oom問題,大大提高APP的質量。
  • 關于如何配置,這個就不說呢,網上有步驟

5.Leakcanary捕捉常見的內存泄漏及解決辦法

5.0.1 錯誤使用單例造成的內存泄漏

  • 在平時開發中單例設計模式是我們經常使用的一種設計模式,而在開發中單例經常需要持有Context對象,如果持有的Context對象生命周期與單例生命周期更短時,或導致Context無法被釋放回收,則有可能造成內存泄漏,錯誤寫法如下:
  • 問題引起內存泄漏代碼
    public class LoginManager {private static LoginManager mInstance;private Context mContext;private LoginManager(Context context) {this.mContext = context;          //修改代碼:this.mContext = context.getApplicationContext();}public static LoginManager getInstance(Context context) {if (mInstance == null) {synchronized (LoginManager.class) {if (mInstance == null) {mInstance = new LoginManager(context);}}}return mInstance;}public void dealData() {}
    }
    復制代碼
  • 使用場景
    • 在一個Activity中調用的,然后關閉該Activity則會出現內存泄漏。
    LoginManager.getInstance(this).dealData();
    復制代碼
  • 看看報錯截圖
  • 解決辦法:
    • 要保證Context和AppLication的生命周期一樣,修改后代碼如下:
    • this.mContext = context.getApplicationContext();
    • 1、如果此時傳入的是 Application 的 Context,因為 Application 的生命周期就是整個應用的生命周期,所以這將沒有任何問題。
    • 2、如果此時傳入的是 Activity 的 Context,當這個 Context 所對應的 Activity 退出時,由于該 Context 的引用被單例對象所持有,其生命周期等于整個應用程序的生命周期,所以當前 Activity 退出時它的內存并不會被回收,這就造成泄漏了。

5.0.2 錯誤使用靜態變量,導致引用后無法銷毀

  • 在平時開發中,有時候我們創建了一個工具類。比如分享工具類,十分方便多處調用,因此使用靜態方法是十分方便的。但是創建的對象,建議不要全局化,全局化的變量必須加上static。這樣會引起內存泄漏!
  • 問題代碼
  • 使用場景
    • 在Activity中引用后,關閉該Activity會導致內存泄漏
    DoShareUtil.showFullScreenShareView(PNewsContentActivity.this, title, title, shareurl, logo);
    復制代碼
  • 查看報錯
  • 解決辦法
    • 靜態方法中,創建對象或變量,不要全局化,全局化后的變量或者對象會導致內存泄漏;popMenuView和popMenu都不要全局化
  • 知識延伸
    非靜態內部類,靜態實例化
    public class MyActivity extends AppCompatActivity {//靜態成員變量public static InnerClass innerClass = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my);innerClass = new InnerClass();}class InnerClass {public void doSomeThing() {}}
    }
    這里內部類InnerClass隱式的持有外部類MyActivity的引用,而在MyActivity的onCreate方法中調用了。
    這樣innerClass就會在MyActivity創建的時候是有了他的引用,而innerClass是靜態類型的不會被垃圾回收,
    MyActivity在執行onDestory方法的時候由于被innerClass持有了引用而無法被回收,所以這樣MyActivity就總是被innerClass持有而無法回收造成內存泄露。靜態變量引用不當會導致內存泄漏
    靜態變量Activity和View會導致內存泄漏,在下面這段代碼中對Activity的Context和TextView設置為靜態對象,從而產生內存泄漏。
    public class MainActivity extends AppCompatActivity {private static Context context;private static TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);context = this;textView = new TextView(this);}
    }
    復制代碼

5.0.3 Handler使用不當造成的內存泄漏

  • handler是工作線程與UI線程之間通訊的橋梁,只是現在大量開源框架對其進行了封裝,我們這里模擬一種常見使用方式來模擬內存泄漏情形。
  • 問題代碼
    public class MainActivity extends AppCompatActivity {private Handler mHandler = new Handler();private TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView = (TextView) findViewById(R.id.text);        //模擬內存泄露mHandler.postDelayed(new Runnable() {@Overridepublic void run() {mTextView.setText("yangchong");}}, 2000);}
    }
    復制代碼
  • 造成內存泄漏原因分析
    • 上述代碼通過內部類的方式創建mHandler對象,此時mHandler會隱式地持有一個外部類對象引用這里就是MainActivity,當執行postDelayed方法時,該方法會將你的Handler裝入一個Message,并把這條Message推到MessageQueue中,MessageQueue是在一個Looper線程中不斷輪詢處理消息,那么當這個Activity退出時消息隊列中還有未處理的消息或者正在處理消息,而消息隊列中的Message持有mHandler實例的引用,mHandler又持有Activity的引用,所以導致該Activity的內存資源無法及時回收,引發內存泄漏。
  • 查看報錯結果如下:
  • 解決方案
    • 第一種解決辦法
      • 要想避免Handler引起內存泄漏問題,需要我們在Activity關閉退出的時候的移除消息隊列中所有消息和所有的Runnable。
      • 上述代碼只需在onDestroy()函數中調用mHandler.removeCallbacksAndMessages(null);就行了。
    @Override
    protected void onDestroy() {super.onDestroy();if(handler!=null){handler.removeCallbacksAndMessages(null);handler = null;}
    }
    復制代碼
    • 第二種解決方案
      • 使用弱引用解決handler內存泄漏問題
    public class SampleActivity extends Activity {private static class MyHandler extends Handler {private final WeakReference<SampleActivity> mActivity;public MyHandler(SampleActivity activity) {mActivity = new WeakReference<SampleActivity>(activity);}@Overridepublic void handleMessage(Message msg) {SampleActivity activity = mActivity.get();if (activity != null) {// ...}}private final MyHandler mHandler = new MyHandler(this);private static final Runnable sRunnable = new Runnable() {@Overridepublic void run() { /* ... */ }};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mHandler.postDelayed(sRunnable, 1000 * 60 * 10);finish();}
    }即推薦使用靜態內部類 + WeakReference 這種方式。每次使用前注意判空。
    復制代碼

5.0.4 線程造成的內存泄漏

  • 早時期的時候處理耗時操作多數都是采用Thread+Handler的方式,后來逐步被AsyncTask取代,直到現在采用RxJava的方式來處理異步。這里以AsyncTask為例,可能大部分人都會這樣處理一個耗時操作然后通知UI更新結果:
  • 問題代碼
    public class MainActivity extends AppCompatActivity {private AsyncTask<Void, Void, Integer> asyncTask;private TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView = (TextView) findViewById(R.id.text);testAsyncTask();finish();}private void testAsyncTask() {asyncTask = new AsyncTask<Void, Void, Integer>() {@Overrideprotected Integer doInBackground(Void... params) {int i = 0;//模擬耗時操作while (!isCancelled()) {i++;if (i > 1000000000) {break;}Log.e("LeakCanary", "asyncTask---->" + i);}return i;}@Overrideprotected void onPostExecute(Integer integer) {super.onPostExecute(integer);mTextView.setText(String.valueOf(integer));}};asyncTask.execute();}
    }
    復制代碼
  • 造成內存泄漏原因分析
    • 在處理一個比較耗時的操作時,可能還沒處理結束MainActivity就執行了退出操作,但是此時AsyncTask依然持有對MainActivity的引用就會導致MainActivity無法釋放回收引發內存泄漏
  • 查看報錯結果如下:
  • 解決辦法
    • 在使用AsyncTask時,在Activity銷毀時候也應該取消相應的任務AsyncTask.cancel()方法,避免任務在后臺執行浪費資源,進而避免內存泄漏的發生
    private void destroyAsyncTask() {if (asyncTask != null && !asyncTask.isCancelled()) {asyncTask.cancel(true);}asyncTask = null;
    }@Override
    protected void onDestroy() {super.onDestroy();destroyAsyncTask();
    }
    復制代碼

5.0.5 非靜態內部類創建靜態實例造成的內存泄漏

  • 有的時候我們可能會在啟動頻繁的Activity中,為了避免重復創建相同的數據資源,可能會出現這種寫法
  • 問題代碼
    private static TestResource mResource = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if(mResource == null){mResource = new TestResource();}
    }class TestResource {//里面代碼引用上下文,Activity.this會導致內存泄漏
    }
    復制代碼
  • 解決辦法
    • 將該內部類設為靜態內部類或將該內部類抽取出來封裝成一個單例,如果需要使用Context,請按照上面推薦的使用Application 的 Context。
  • 分析問題
    • 這樣就在Activity內部創建了一個非靜態內部類的單例,每次啟動Activity時都會使用該單例的數據,這樣雖然避免了資源的重復創建,不過這種寫法卻會造成內存泄漏,因為非靜態內部類默認會持有外部類的引用,而該非靜態內部類又創建了一個靜態的實例,該實例的生命周期和應用的一樣長,這就導致了該靜態實例一直會持有該Activity的引用,導致Activity的內存資源不能正常回收。

5.0.6 不需要用的監聽未移除會發生內存泄露

  • 問題代碼
    //add監聽,放到集合里面
    tv.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {@Overridepublic void onWindowFocusChanged(boolean b) {//監聽view的加載,view加載出來的時候,計算他的寬高等。}
    });
    復制代碼
  • 解決辦法
    //計算完后,一定要移除這個監聽
    tv.getViewTreeObserver().removeOnWindowFocusChangeListener(this);
    復制代碼
  • 注意事項:
    tv.setOnClickListener();//監聽執行完回收對象,不用考慮內存泄漏
    tv.getViewTreeObserver().addOnWindowFocusChangeListene,add監聽,放到集合里面,需要考慮內存泄漏
    復制代碼

5.0.7 [常見]資源未關閉造成的內存泄漏

  • BroadcastReceiver,ContentObserver,FileObserver,Cursor,Callback等在 Activity onDestroy 或者某類生命周期結束之后一定要 unregister 或者 close 掉,否則這個 Activity 類會被 system 強引用,不會被內存回收。值得注意的是,關閉的語句必須在finally中進行關閉,否則有可能因為異常未關閉資源,致使activity泄漏。
5.0.7.1 廣播注冊之后沒有被銷毀導致內存泄漏
- 比如我們在Activity中注冊廣播,如果在Activity銷毀后不取消注冊,那么這個廣播會一直存在系統中,同上面所說的非靜態內部類一樣持有Activity引用,導致內存泄露。因此注冊廣播后在Activity銷毀后一定要取消注冊。
- 在注冊觀察則模式的時候,如果不及時取消也會造成內存泄露。比如使用Retrofit+RxJava注冊網絡請求的觀察者回調,同樣作為匿名內部類持有外部引用,所以需要記得在不用或者銷毀的時候取消注冊。
```
public class MeAboutActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.registerReceiver(mReceiver, new IntentFilter());}private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// 接收到廣播需要做的邏輯}};@Overrideprotected void onDestroy() {super.onDestroy();this.unregisterReceiver(mReceiver);}
}
```
復制代碼
5.0.7.2 資源未關閉導致資源被占用而內存泄漏
  • 在使用IO、File流或者Sqlite、Cursor等資源時要及時關閉。這些資源在進行讀寫操作時通常都使用了緩沖,如果及時不關閉,這些緩沖對象就會一直被占用而得不到釋放,以致發生內存泄露。因此我們在不需要使用它們的時候就及時關閉,以便緩沖能及時得到釋放,從而避免內存泄露。

5.0.8 未注銷EventBus導致的內存泄漏

  • 直接展示代碼
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_common);EventBus.getDefault().register(this);
    }@Subscribe
    public void onEvent(MessageEvent msg) {}@Override
    protected void onDestroy() {super.onDestroy();//未移除注冊的EventBus//EventBus.getDefault().unregister(this);
    }
    復制代碼

5.0.9 持有activity引用未被釋放導致內存泄漏

5.0.9.1 第一種場景
  • 先看看問題代碼
    • 這個是在開發中經常會犯的錯誤,NastyManager.getInstance() 是一個單例,當我們通過 addListener(this) 將 Activity 作為 Listener 和 NastyManager 綁定起來的時候,由于單例和Activity生命周期不同,因此銷毀時就會導致內存泄漏。
    public class LeakActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);NastyManager.getInstance().addListener(this);}
    }
    復制代碼
  • 解決辦法:
    • 在你的 Acitivity 被銷毀的時候,將他和 NastyManager 取消掉綁定就好
    public class LeakActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);NastyManager.getInstance().addListener(this);}@Overrideprotected void onDestroy() {super.onDestroy();NastyManager.getInstance().removeListener(this);}
    }
    復制代碼
5.0.9.2 第二種場景
  • 先來看看造成內存泄漏的代碼
    • 通過查看Toast類的源碼可以看到,Toast類內部的mContext指向傳入的Context。而ToastUtils中的toast變量是靜態類型的,其生命周期是與整個應用一樣長的,從而導致activity得不到釋放。因此,對Context的引用不能超過它本身的生命周期。
    /*** 吐司工具類    避免點擊多次導致吐司多次,最后導致Toast就長時間關閉不掉了* @param context       注意:這里如果傳入context會報內存泄漏;傳遞activity..getApplicationContext()* @param content       吐司內容*/
    private static Toast toast;
    @SuppressLint("ShowToast")
    public static void showToast(Context context, String content) {if (toast == null) {toast = Toast.makeText(context , content, Toast.LENGTH_SHORT);} else {toast.setText(content);}toast.show();
    }
    復制代碼
  • 解決辦法
    • 是改為使用 ApplicationContext即可,因為ApplicationContext會隨著應用的存在而存在,而不依賴于Activity的生命周期

5.1.0 靜態集合使用不當導致的內存泄漏

  • 有時候我們需要把一些對象加入到集合容器(例如ArrayList)中,當不再需要當中某些對象時,如果不把該對象的引用從集合中清理掉,也會使得GC無法回收該對象。如果集合是static類型的話,那內存泄漏情況就會更為嚴重。因此,當不再需要某對象時,需要主動將之從集合中移除。

5.1.1 動畫資源未釋放導致內存泄漏

  • 問題代碼
    public class LeakActivity extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_leak);textView = (TextView)findViewById(R.id.text_view);ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView,"rotation",0,360);objectAnimator.setRepeatCount(ValueAnimator.INFINITE);objectAnimator.start();}
    }
    復制代碼
  • 解決辦法
    • 在屬性動畫中有一類無限循環動畫,如果在Activity中播放這類動畫并且在onDestroy中去停止動畫,那么這個動畫將會一直播放下去,這時候Activity會被View所持有,從而導致Activity無法被釋放。解決此類問題則是需要早Activity中onDestroy去去調用objectAnimator.cancel()來停止動畫。
    @Override
    protected void onDestroy() {super.onDestroy();mAnimator.cancel();
    }
    復制代碼

5.1.2 系統bug之InputMethodManager導致內存泄漏

  • 每次從MainActivity退出程序時總會報InputMethodManager內存泄漏,原因系統中的InputMethodManager持有當前MainActivity的引用,導致了MainActivity不能被系統回收,從而導致了MainActivity的內存泄漏。查了很多資料,發現這是 Android SDK中輸入法的一個Bug,在15<=API<=23中都存在,目前Google還沒有解決這個Bug。

6.其他建議

6.0.1 盡量避免使用 static 成員變量

  • 盡量避免使用 static 成員變量
    • 如果成員變量被聲明為 static,那我們都知道其生命周期將與整個app進程生命周期一樣。這會導致一系列問題,如果你的app進程設計上是長駐內存的,那即使app切到后臺,這部分內存也不會被釋放。按照現在手機app內存管理機制,占內存較大的后臺進程將優先回收,如果此app做過進程互保保活,那會造成app在后臺頻繁重啟。當手機安裝了你參與開發的app以后一夜時間手機被消耗空了電量、流量,你的app不得不被用戶卸載或者靜默。
    • 架構設計上要思考是否真的有必要這樣做,盡量避免。如果架構需要這么設計,那么此對象的生命周期你有責任管理起來。

關于其他內容介紹

01.關于博客匯總鏈接

  • 1.技術博客匯總
  • 2.開源項目匯總
  • 3.生活博客匯總
  • 4.喜馬拉雅音頻匯總
  • 5.其他匯總

02.關于我的博客

  • 我的個人站點:www.yczbj.org,www.ycbjie.cn
  • github:github.com/yangchong21…
  • 知乎:www.zhihu.com/people/yang…
  • 簡書:www.jianshu.com/u/b7b2c6ed9…
  • csdn:my.csdn.net/m0_37700275
  • 喜馬拉雅聽書:www.ximalaya.com/zhubo/71989…
  • 開源中國:my.oschina.net/zbj1618/blo…
  • 泡在網上的日子:www.jcodecraeer.com/member/cont…
  • 郵箱:yangchong211@163.com
  • 阿里云博客:yq.aliyun.com/users/artic… 239.headeruserinfo.3.dT4bcV
  • segmentfault頭條:segmentfault.com/u/xiangjian…

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537841.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redmine更換主題

主題列表&#xff1a;http://www.redmine.org/projects/redmine/wiki/Theme_List 雖然有很多主題&#xff0c;但是很多主題都是要錢的&#xff0c;像這類&#xff08;上圖&#xff09;沒有下載地址的&#xff0c;都是要錢的。 含GitHub的下載地址的&#xff0c;是免費可下載的&…

redmine 郵箱配置(阿里云+windows)

說明 密碼是第三方的授權碼&#xff0c;不是郵箱密碼 需要登錄126網頁版&#xff0c;在設置里開啟 smtp 等第三方服務&#xff0c;設置授權碼 阿里云Linux 默認屏蔽25號端口&#xff0c;所以需要開啟ssl&#xff0c;和使用 465 端口 重啟下 redmind sh /opt/redmine-3.4.6-…

linux查看當前用戶終端,Linux----基本命令的使用(vi命令,查看文件內容,顯示進程,切換用戶等)...

1、vi是linux系統上經常使用的一個文本編輯器&#xff0c;其有三種模式&#xff1a;命令模式、編輯模式(插入模式)、末行模式。命令模式——>編輯模式&#xff1a;“i a o I A O”linux編輯模式——>命令模式&#xff1a;“ESC”shell命令模式——>末行模式&#xff1…

centos6.8 環境一鍵安裝包 nginx配置thinkphp5

---恢復內容開始--- lnmp1.4 一鍵安裝包 nginx配置thinkphp5 環境&#xff1a;Nginx1.12.1 PHP5.6 Coentos6.8 修改網站配置文件 server{listen 443 ssl http2;#listen [::]:443 ssl http2;server_name xxx.cn;index index.html index.htm index.php default.html default.ht…

Linux下BitNami Redmine的插件安裝與更新

截至2017年3月27日&#xff0c;Redmine-3.3.2-2安裝以下的15款插件全部成功并通過測試&#xff08;下面顯示為插件正確文件夾名&#xff09;&#xff1a; easy_wbs redmine_ckeditor 提供所見即所得編輯器 redmine_graphs 提供部分問題圖表功能 progressive_projects_list 是…

linux 進程 讀寫鎖,linux 下實現高性能讀寫鎖(read/write lock)

前一篇文章分析了Windows slim read/write lock的工作原理。我們知道它的設計相當精妙&#xff0c;于是我們可以借鑒它的思路來設計linux下的讀寫鎖。在這個讀寫鎖的設計上&#xff0c;需要注意的是linux和windows有以下幾點區別&#xff1a;(1)windows使用的keyedevent機制需要…

Linux下redmine安裝插件報錯

報錯如下&#xff1a; There was an error parsing Gemfile: compile error - syntax error, unexpected :, expecting $end gem tzinfo-data, platforms: [:mingw, :x64_mingw, :mswin, :jruby]^. Bundler cannot continue. 原因是&#xff1a; redmine不同版本對ruby版本有…

ajax post 提交無法進入controller 請求200

最近寫js遇到個問題&#xff1a; 用ajax的post方式給后臺提交數據&#xff0c;頁面200&#xff0c;但是不進入controller 斷點&#xff0c;我以為我post參數不對。 網上查的&#xff1a; 1.說路徑不對&#xff0c;但是我通過get方式是可以進入的&#xff0c;路徑是沒問題的&…

cuda 編譯 linux,Linux下安裝Tensorflow源碼及編譯

下載Tensorflow源碼git clone https://github.com/tensorflow/tensorflow如果無法下載也可以在github上直接下載tensorflow的打包文件&#xff0c;這樣也能編譯&#xff0c;但是不能使用git命令可根據需要切換到不同的分支安裝bazel輸入以下命令echo "deb [archamd64] htt…

testflight進行用戶的beta測試

發發發轉載于:https://www.cnblogs.com/caimaomao/p/9681483.html

linux限制ping的時間,如何限制Linux命令程序運行的時間

Linux提供了大量的命令&#xff0c;每個命令都是唯一的&#xff0c;并且在特定的情況下使用。Linux的目標是幫助您盡可能地高效工作。Linux命令的一個屬性是時間限制。您可以為任何您想要的命令設置時間限制。如果時間過期&#xff0c;命令停止執行。在本教程中&#xff0c;您將…

微軟網絡工具psping介紹

該工具功能主要包括&#xff1a;ICMP Ping、TCP Ping、延遲測試、帶寬測試&#xff0c;而且它是微軟出品的下載地址&#xff1a;https://download.sysinternals.com/files/PSTools.ziphttp://technet.microsoft.com/en-us/sysinternals/jj729731解壓后把psping.exe丟到C:\Windo…

mac svn

https://formac.informer.com/tortoisesvn

linux服務器虛擬內存設置,修改Linux服務器虛擬內存Swap大小

Linux的Swap相當于Windows的虛擬內存&#xff0c;當物理內存不夠的時候&#xff0c;就需要將物理內存中的一部分空間釋放出來&#xff0c;以供當前運行的程序使用。那些被釋放出來的空間可能來自一些很長時間沒有什么操作的程序&#xff0c;這些被釋放的空間臨時保存到Swap空間…

高級軟件工程第一次作業--準備

1&#xff09; 回想一下你對計算機/軟件工程專業的暢想 考研之所以選擇計算機專業&#xff0c;是因為本科就是這個專業。不去跨專業&#xff0c;是因為覺得換個專業考&#xff0c;比起那些科班出身的人&#xff0c;考上的機率會更小&#xff0c;也有一部分原因是因為比起計算機…

里程碑事件

里程碑事件&#xff1a;里程碑事件往往是一個時間要求為零的任務&#xff0c;即它并非是一個要實實在在完成的任務&#xff0c;而是一個標志性的事件。 例如&#xff0c;在軟件開發項目中的“測試”是一個子任務&#xff0c;“撰寫測試報告”也是一個子任務&#xff0c;但“完…

linux無法下載ftp,linux 不能下載怎么辦

linux 不能下載怎么辦&#xff1f;關于Linux下vsftp匿名用戶上傳和下載的配置配置要注意三部分&#xff0c;請一一仔細對照&#xff1a;1、vsftpd.conf文件的配置(vi /etc/vsftpd/vsftpd.conf)&#xff03;允許匿名用戶登錄FTPanonymous_enableYES&#xff03;設置匿名用戶的登…

Mysql8.0Mysql5.7Mysql5.6Mysql5.5特性對比

Mysql5.5 特性&#xff0c;相對于Mysql5.1 性能提升 默認InnoDB plugin引擎。具有提交、回滾和crash恢復功能、ACID兼容。 行級鎖(一致性的非鎖定讀 MVCC)。 表與索引存儲在表空間、表大小無限制。 支持dynamic(primary key緩存內存 避免主鍵查詢引起的IO )與compressed(支…

Spring IOC實現原理

2019獨角獸企業重金招聘Python工程師標準>>> 1、BeanDefinition 對依賴翻轉模式中管理對象依賴關系的數據抽象 實現依賴翻轉功能的核心數據結構依賴翻轉功能都是圍繞對BeanDefinition 處理完成的有了這些BeanDefinition 基礎數據結構&#xff0c;容器才能發揮作用2、…

linux3.0 nand分區,OK6410(256MRAM2Gnandflash) Linux3.0.1內核移植

這里我主要移植的是增加yaffs2文件系統支持&#xff0c;修改和移植nand驅動。1.不知道為什么我這yaffs2的補丁打上了就沒發現過編譯錯誤&#xff0c;相當順利啊 呵呵。附上補丁地址-----------------------------------點擊打開鏈接修改補丁里patch‐ker.sh 文件。屏蔽下面這段…