内存泄漏优化

目录介绍:

  • 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.mzph.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 文件。屏蔽下面这段…