精华内容
下载资源
问答
  • Android内存管理优化建议

    千次阅读 2016-10-17 12:42:35
    前面介绍了一些基础的内存管理机制以及OOM的基础知识,那么在实践操作当中,有哪些指导性的规则可以参考呢?归纳下来,可以从四个方面着手,首先是减小对象的内存占用,其次是内存对象的重复利用,然后是避免对象的...

    OOM(OutOfMemory)
    前面我们提到过使用getMemoryClass()的方法可以得到Dalvik Heap的阈值。简要的获取某个应用的内存占用情况可以参考下面的示例( 关于更多内存查看的知识,可以参考这篇官方教程:Investigating Your RAM Usage )

    1)查看内存使用情况
    通过命令行查看内存详细占用情况:

    通过Android Studio的Memory Monitor查看内存中Dalvik Heap的实时变化

    2)发生OOM的条件
    关于Native Heap,Dalvik Heap,Pss等内存管理机制比较复杂,这里不展开描述。简单的说,通过不同的内存分配方式(malloc/mmap/JNIEnv/etc)对不同的对象(bitmap,etc)进行操作会因为Android系统版本的差异而产生不同的行为,对Native Heap与Dalvik Heap以及OOM的判断条件都会有所影响。在2.x的系统上,我们常常可以看到Heap Size的total值明显超过了通过getMemoryClass()获取到的阈值而不会发生OOM的情况,那么针对2.x与4.x的Android系统,到底是如何判断会发生OOM呢?

    Android 2.x系统 GC LOG中的dalvik allocated + external allocated + 新分配的大小 >= getMemoryClass()值的时候就会发生OOM。 例如,假设有这么一段Dalvik输出的GC LOG:GC_FOR_MALLOC free 2K, 13% free 32586K/37455K, external 8989K/10356K, paused 20ms,那么32586+8989+(新分配23975)=65550>64M时,就会发生OOM。

    Android 4.x系统 Android 4.x的系统废除了external的计数器,类似bitmap的分配改到dalvik的java heap中申请,只要allocated + 新分配的内存 >= getMemoryClass()的时候就会发生OOM,如下图所示(虽然图示演示的是art运行环境,但是统计规则还是和dalvik保持一致)

    (三)如何避免OOM总结
    前面介绍了一些基础的内存管理机制以及OOM的基础知识,那么在实践操作当中,有哪些指导性的规则可以参考呢?归纳下来,可以从四个方面着手,首先是减小对象的内存占用,其次是内存对象的重复利用,然后是避免对象的内存泄露,最后是内存使用策略优化。

    减小对象的内存占用
    避免OOM的第一步就是要尽量减少新分配出来的对象占用内存的大小,尽量使用更加轻量的对象。

    1)使用更加轻量的数据结构
    例如,我们可以考虑使用ArrayMap/SparseArray而不是HashMap等传统数据结构,下图演示了HashMap的简要工作原理,相比起Android系统专门为移动操作系统编写的ArrayMap容器,在大多数情况下,都显示效率低下,更占内存。通常的HashMap的实现方式更加消耗内存,因为它需要一个额外的实例对象来记录Mapping操作。另外,SparseArray更加高效在于他们避免了对key与value的autobox自动装箱,并且避免了装箱后的解箱。

    关于更多ArrayMap/SparseArray的讨论,请参考http://hukai.me/android-performance-patterns-season-3/的前三个段落

    2)避免在Android里面使用Enum
    Android官方培训课程提到过“Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.”,具体原理请参考http://hukai.me/android-performance-patterns-season-3/,所以请避免在Android里面使用到枚举。

    3)减小Bitmap对象的内存占用
    Bitmap是一个极容易消耗内存的大胖子,减小创建出来的Bitmap的内存占用是很重要的,通常来说有下面2个措施:

    inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
    decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。
    4)使用更小的图片
    在设计给到资源图片的时候,我们需要特别留意这张图片是否存在可以压缩的空间,是否可以使用一张更小的图片。尽量使用更小的图片不仅仅可以减少内存的使用,还可以避免出现大量的InflationException。假设有一张很大的图片被XML文件直接引用,很有可能在初始化视图的时候就会因为内存不足而发生InflationException,这个问题的根本原因其实是发生了OOM。

    内存对象的重复利用
    大多数对象的复用,最终实施的方案都是利用对象池技术,要么是在编写代码的时候显式的在程序里面去创建对象池,然后处理好复用的实现逻辑,要么就是利用系统框架既有的某些复用特性达到减少对象的重复创建,从而减少内存的分配与回收。

    在Android上面最常用的一个缓存算法是LRU(Least Recently Use),简要操作原理如下图所示:

    1)复用系统自带的资源
    Android系统本身内置了很多的资源,例如字符串/颜色/图片/动画/样式以及简单布局等等,这些资源都可以在应用程序中直接引用。这样做不仅仅可以减少应用程序的自身负重,减小APK的大小,另外还可以一定程度上减少内存的开销,复用性更好。但是也有必要留意Android系统的版本差异性,对那些不同系统版本上表现存在很大差异,不符合需求的情况,还是需要应用程序自身内置进去。

    2)注意在ListView/GridView等出现大量重复子组件的视图里面对ConvertView的复用

    3)Bitmap对象的复用
    在ListView与GridView等显示大量图片的控件里面需要使用LRU的机制来缓存处理好的Bitmap。

    利用inBitmap的高级特性提高Android系统在Bitmap分配与释放执行效率上的提升(3.0以及4.4以后存在一些使用限制上的差异)。使用inBitmap属性可以告知Bitmap解码器去尝试使用已经存在的内存区域,新解码的bitmap会尝试去使用之前那张bitmap在heap中所占据的pixel data内存区域,而不是去问内存重新申请一块区域来存放bitmap。利用这种特性,即使是上千张的图片,也只会仅仅只需要占用屏幕所能够显示的图片数量的内存大小。

    使用inBitmap需要注意几个限制条件:

    在SDK 11 -> 18之间,重用的bitmap大小必须是一致的,例如给inBitmap赋值的图片大小为100-100,那么新申请的bitmap必须也为100-100才能够被重用。从SDK 19开始,新申请的bitmap大小必须小于或者等于已经赋值过的bitmap大小。
    新申请的bitmap与旧的bitmap必须有相同的解码格式,例如大家都是8888的,如果前面的bitmap是8888,那么就不能支持4444与565格式的bitmap了。 我们可以创建一个包含多种典型可重用bitmap的对象池,这样后续的bitmap创建都能够找到合适的“模板”去进行重用。如下图所示:

    另外提一点:在2.x的系统上,尽管bitmap是分配在native层,但是还是无法避免被计算到OOM的引用计数器里面。这里提示一下,不少应用会通过反射BitmapFactory.Options里面的inNativeAlloc来达到扩大使用内存的目的,但是如果大家都这么做,对系统整体会造成一定的负面影响,建议谨慎采纳。

    4)避免在onDraw方法里面执行对象的创建
    类似onDraw等频繁调用的方法,一定需要注意避免在这里做创建对象的操作,因为他会迅速增加内存的使用,而且很容易引起频繁的gc,甚至是内存抖动。

    5)StringBuilder
    在有些时候,代码中会需要使用到大量的字符串拼接的操作,这种时候有必要考虑使用StringBuilder来替代频繁的“+”。

    避免对象的内存泄露
    内存对象的泄漏,会导致一些不再使用的对象无法及时释放,这样一方面占用了宝贵的内存空间,很容易导致后续需要分配内存的时候,空闲空间不足而出现OOM。显然,这还使得每级Generation的内存区域可用空间变小,gc就会更容易被触发,容易出现内存抖动,从而引起性能问题。

    最新的LeakCanary开源控件,可以很好的帮助我们发现内存泄露的情况,更多关于LeakCanary的介绍,请看这里https://github.com/square/leakcanary(中文使用说明http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/)。另外也可以使用传统的MAT工具查找内存泄露,请参考这里http://android-developers.blogspot.pt/2011/03/memory-analysis-for-android.html(便捷的中文资料http://androidperformance.com/2015/04/11/AndroidMemory-Usage-Of-MAT/

    1)注意Activity的泄漏
    通常来说,Activity的泄漏是内存泄漏里面最严重的问题,它占用的内存多,影响面广,我们需要特别注意以下两种情况导致的Activity泄漏:

    内部类引用导致Activity的泄漏
    最典型的场景是Handler导致的Activity泄漏,如果Handler中有延迟的任务或者是等待执行的任务队列过长,都有可能因为Handler继续执行而导致Activity发生泄漏。此时的引用关系链是Looper -> MessageQueue -> Message -> Handler -> Activity。为了解决这个问题,可以在UI退出之前,执行remove Handler消息队列中的消息与runnable对象。或者是使用Static + WeakReference的方式来达到断开Handler与Activity之间存在引用关系的目的。

    Activity Context被传递到其他实例中,这可能导致自身被引用而发生泄漏。
    内部类引起的泄漏不仅仅会发生在Activity上,其他任何内部类出现的地方,都需要特别留意!我们可以考虑尽量使用static类型的内部类,同时使用WeakReference的机制来避免因为互相引用而出现的泄露。

    2)考虑使用Application Context而不是Activity Context
    对于大部分非必须使用Activity Context的情况(Dialog的Context就必须是Activity Context),我们都可以考虑使用Application Context而不是Activity的Context,这样可以避免不经意的Activity泄露。

    3)注意临时Bitmap对象的及时回收
    虽然在大多数情况下,我们会对Bitmap增加缓存机制,但是在某些时候,部分Bitmap是需要及时回收的。例如临时创建的某个相对比较大的bitmap对象,在经过变换得到新的bitmap对象之后,应该尽快回收原始的bitmap,这样能够更快释放原始bitmap所占用的空间。

    需要特别留意的是Bitmap类里面提供的createBitmap()方法:

    这个函数返回的bitmap有可能和source bitmap是同一个,在回收的时候,需要特别检查source bitmap与return bitmap的引用是否相同,只有在不等的情况下,才能够执行source bitmap的recycle方法。

    4)注意监听器的注销
    在Android程序里面存在很多需要register与unregister的监听器,我们需要确保在合适的时候及时unregister那些监听器。自己手动add的listener,需要记得及时remove这个listener。

    5)注意缓存容器中的对象泄漏
    有时候,我们为了提高对象的复用性把某些对象放到缓存容器中,可是如果这些对象没有及时从容器中清除,也是有可能导致内存泄漏的。例如,针对2.3的系统,如果把drawable添加到缓存容器,因为drawable与View的强应用,很容易导致activity发生泄漏。而从4.0开始,就不存在这个问题。解决这个问题,需要对2.3系统上的缓存drawable做特殊封装,处理引用解绑的问题,避免泄漏的情况。

    6)注意WebView的泄漏
    Android中的WebView存在很大的兼容性问题,不仅仅是Android系统版本的不同对WebView产生很大的差异,另外不同的厂商出货的ROM里面WebView也存在着很大的差异。更严重的是标准的WebView存在内存泄露的问题,看这里WebView causes memory leak - leaks the parent Activity。所以通常根治这个问题的办法是为WebView开启另外一个进程,通过AIDL与主进程进行通信,WebView所在的进程可以根据业务的需要选择合适的时机进行销毁,从而达到内存的完整释放。

    7)注意Cursor对象是否及时关闭
    在程序中我们经常会进行查询数据库的操作,但时常会存在不小心使用Cursor之后没有及时关闭的情况。这些Cursor的泄露,反复多次出现的话会对内存管理产生很大的负面影响,我们需要谨记对Cursor对象的及时关闭。

    内存使用策略优化
    1)谨慎使用large heap
    正如前面提到的,Android设备根据硬件与软件的设置差异而存在不同大小的内存空间,他们为应用程序设置了不同大小的Heap限制阈值。你可以通过调用getMemoryClass()来获取应用的可用Heap大小。在一些特殊的情景下,你可以通过在manifest的application标签下添加largeHeap=true的属性来为应用声明一个更大的heap空间。然后,你可以通过getLargeMemoryClass()来获取到这个更大的heap size阈值。然而,声明得到更大Heap阈值的本意是为了一小部分会消耗大量RAM的应用(例如一个大图片的编辑应用)。不要轻易的因为你需要使用更多的内存而去请求一个大的Heap Size。只有当你清楚的知道哪里会使用大量的内存并且知道为什么这些内存必须被保留时才去使用large heap。因此请谨慎使用large heap属性。使用额外的内存空间会影响系统整体的用户体验,并且会使得每次gc的运行时间更长。在任务切换时,系统的性能会大打折扣。另外, large heap并不一定能够获取到更大的heap。在某些有严格限制的机器上,large heap的大小和通常的heap size是一样的。因此即使你申请了large heap,你还是应该通过执行getMemoryClass()来检查实际获取到的heap大小。

    2)综合考虑设备内存阈值与其他因素设计合适的缓存大小
    例如,在设计ListView或者GridView的Bitmap LRU缓存的时候,需要考虑的点有:

    应用程序剩下了多少可用的内存空间?
    有多少图片会被一次呈现到屏幕上?有多少图片需要事先缓存好以便快速滑动时能够立即显示到屏幕?
    设备的屏幕大小与密度是多少? 一个xhdpi的设备会比hdpi需要一个更大的Cache来hold住同样数量的图片。
    不同的页面针对Bitmap的设计的尺寸与配置是什么,大概会花费多少内存?
    页面图片被访问的频率?是否存在其中的一部分比其他的图片具有更高的访问频繁?如果是,也许你想要保存那些最常访问的到内存中,或者为不同组别的位图(按访问频率分组)设置多个LruCache容器。
    3)onLowMemory()与onTrimMemory()
    Android用户可以随意在不同的应用之间进行快速切换。为了让background的应用能够迅速的切换到forground,每一个background的应用都会占用一定的内存。Android系统会根据当前的系统的内存使用情况,决定回收部分background的应用内存。如果background的应用从暂停状态直接被恢复到forground,能够获得较快的恢复体验,如果background应用是从Kill的状态进行恢复,相比之下就显得稍微有点慢。

    onLowMemory():Android系统提供了一些回调来通知当前应用的内存使用情况,通常来说,当所有的background应用都被kill掉的时候,forground应用会收到onLowMemory()的回调。在这种情况下,需要尽快释放当前应用的非必须的内存资源,从而确保系统能够继续稳定运行。
    onTrimMemory(int):Android系统从4.0开始还提供了onTrimMemory()的回调,当系统内存达到某些条件的时候,所有正在运行的应用都会收到这个回调,同时在这个回调里面会传递以下的参数,代表不同的内存使用情况,收到onTrimMemory()回调的时候,需要根据传递的参数类型进行判断,合理的选择释放自身的一些内存占用,一方面可以提高系统的整体运行流畅度,另外也可以避免自己被系统判断为优先需要杀掉的应用。下图介绍了各种不同的回调参数:

    TRIM_MEMORY_UI_HIDDEN:你的应用程序的所有UI界面被隐藏了,即用户点击了Home键或者Back键退出应用,导致应用的UI界面完全不可见。这个时候应该释放一些不可见的时候非必须的资源

    当程序正在前台运行的时候,可能会接收到从onTrimMemory()中返回的下面的值之一:

    TRIM_MEMORY_RUNNING_MODERATE:你的应用正在运行并且不会被列为可杀死的。但是设备此时正运行于低内存状态下,系统开始触发杀死LRU Cache中的Process的机制。
    TRIM_MEMORY_RUNNING_LOW:你的应用正在运行且没有被列为可杀死的。但是设备正运行于更低内存的状态下,你应该释放不用的资源用来提升系统性能。
    TRIM_MEMORY_RUNNING_CRITICAL:你的应用仍在运行,但是系统已经把LRU Cache中的大多数进程都已经杀死,因此你应该立即释放所有非必须的资源。如果系统不能回收到足够的RAM数量,系统将会清除所有的LRU缓存中的进程,并且开始杀死那些之前被认为不应该杀死的进程,例如那个包含了一个运行态Service的进程。
    当应用进程退到后台正在被Cached的时候,可能会接收到从onTrimMemory()中返回的下面的值之一:

    TRIM_MEMORY_BACKGROUND: 系统正运行于低内存状态并且你的进程正处于LRU缓存名单中最不容易杀掉的位置。尽管你的应用进程并不是处于被杀掉的高危险状态,系统可能已经开始杀掉LRU缓存中的其他进程了。你应该释放那些容易恢复的资源,以便于你的进程可以保留下来,这样当用户回退到你的应用的时候才能够迅速恢复。
    TRIM_MEMORY_MODERATE: 系统正运行于低内存状态并且你的进程已经已经接近LRU名单的中部位置。如果系统开始变得更加内存紧张,你的进程是有可能被杀死的。
    TRIM_MEMORY_COMPLETE: 系统正运行于低内存的状态并且你的进程正处于LRU名单中最容易被杀掉的位置。你应该释放任何不影响你的应用恢复状态的资源。

    因为onTrimMemory()的回调是在API 14才被加进来的,对于老的版本,你可以使用onLowMemory)回调来进行兼容。onLowMemory相当与TRIM_MEMORY_COMPLETE。
    请注意:当系统开始清除LRU缓存中的进程时,虽然它首先按照LRU的顺序来执行操作,但是它同样会考虑进程的内存使用量以及其他因素。占用越少的进程越容易被留下来。
    4)资源文件需要选择合适的文件夹进行存放
    我们知道hdpi/xhdpi/xxhdpi等等不同dpi的文件夹下的图片在不同的设备上会经过scale的处理。例如我们只在hdpi的目录下放置了一张100100的图片,那么根据换算关系,xxhdpi的手机去引用那张图片就会被拉伸到200200。需要注意到在这种情况下,内存占用是会显著提高的。对于不希望被拉伸的图片,需要放到assets或者nodpi的目录下。

    5)Try catch某些大内存分配的操作
    在某些情况下,我们需要事先评估那些可能发生OOM的代码,对于这些可能发生OOM的代码,加入catch机制,可以考虑在catch里面尝试一次降级的内存分配操作。例如decode bitmap的时候,catch到OOM,可以尝试把采样比例再增加一倍之后,再次尝试decode。

    6)谨慎使用static对象
    因为static的生命周期过长,和应用的进程保持一致,使用不当很可能导致对象泄漏,在Android中应该谨慎使用static对象。

    7)特别留意单例对象中不合理的持有
    虽然单例模式简单实用,提供了很多便利性,但是因为单例的生命周期和应用保持一致,使用不合理很容易出现持有对象的泄漏。

    8)珍惜Services资源
    如果你的应用需要在后台使用service,除非它被触发并执行一个任务,否则其他时候Service都应该是停止状态。另外需要注意当这个service完成任务之后因为停止service失败而引起的内存泄漏。 当你启动一个Service,系统会倾向为了保留这个Service而一直保留Service所在的进程。这使得进程的运行代价很高,因为系统没有办法把Service所占用的RAM空间腾出来让给其他组件,另外Service还不能被Paged out。这减少了系统能够存放到LRU缓存当中的进程数量,它会影响应用之间的切换效率,甚至会导致系统内存使用不稳定,从而无法继续保持住所有目前正在运行的service。 建议使用IntentService,它会在处理完交代给它的任务之后尽快结束自己。更多信息,请阅读Running in a Background Service。

    9)优化布局层次,减少内存消耗
    越扁平化的视图布局,占用的内存就越少,效率越高。我们需要尽量保证布局足够扁平化,当使用系统提供的View无法实现足够扁平的时候考虑使用自定义View来达到目的。

    10)谨慎使用“抽象”编程
    很多时候,开发者会使用抽象类作为”好的编程实践”,因为抽象能够提升代码的灵活性与可维护性。然而,抽象会导致一个显著的额外内存开销:他们需要同等量的代码用于可执行,那些代码会被mapping到内存中,因此如果你的抽象没有显著的提升效率,应该尽量避免他们。

    11)使用nano protobufs序列化数据
    Protocol buffers是由Google为序列化结构数据而设计的,一种语言无关,平台无关,具有良好的扩展性。类似XML,却比XML更加轻量,快速,简单。如果你需要为你的数据实现序列化与协议化,建议使用nano protobufs。关于更多细节,请参考protobuf readme的”Nano version”章节。

    12)谨慎使用依赖注入框架
    使用类似Guice或者RoboGuice等框架注入代码,在某种程度上可以简化你的代码。下面是使用RoboGuice前后的对比图:

    使用RoboGuice之后,代码是简化了不少。然而,那些注入框架会通过扫描你的代码执行许多初始化的操作,这会导致你的代码需要大量的内存空间来mapping代码,而且mapped pages会长时间的被保留在内存中。除非真的很有必要,建议谨慎使用这种技术。

    13)谨慎使用多进程
    使用多进程可以把应用中的部分组件运行在单独的进程当中,这样可以扩大应用的内存占用范围,但是这个技术必须谨慎使用,绝大多数应用都不应该贸然使用多进程,一方面是因为使用多进程会使得代码逻辑更加复杂,另外如果使用不当,它可能反而会导致显著增加内存。当你的应用需要运行一个常驻后台的任务,而且这个任务并不轻量,可以考虑使用这个技术。

    一个典型的例子是创建一个可以长时间后台播放的Music Player。如果整个应用都运行在一个进程中,当后台播放的时候,前台的那些UI资源也没有办法得到释放。类似这样的应用可以切分成2个进程:一个用来操作UI,另外一个给后台的Service。

    14)使用ProGuard来剔除不需要的代码
    ProGuard能够通过移除不需要的代码,重命名类,域与方法等等对代码进行压缩,优化与混淆。使用ProGuard可以使得你的代码更加紧凑,这样能够减少mapping代码所需要的内存空间。

    15)谨慎使用第三方libraries
    很多开源的library代码都不是为移动网络环境而编写的,如果运用在移动设备上,并不一定适合。即使是针对Android而设计的library,也需要特别谨慎,特别是在你不知道引入的library具体做了什么事情的时候。例如,其中一个library使用的是nano protobufs, 而另外一个使用的是micro protobufs。这样一来,在你的应用里面就有2种protobuf的实现方式。这样类似的冲突还可能发生在输出日志,加载图片,缓存等等模块里面。另外不要为了1个或者2个功能而导入整个library,如果没有一个合适的库与你的需求相吻合,你应该考虑自己去实现,而不是导入一个大而全的解决方案。

    16)考虑不同的实现方式来优化内存占用
    在某些情况下,设计的某个方案能够快速实现需求,但是这个方案却可能在内存占用上表现的效率不够好。例如:

    对于上面这样一个时钟表盘的实现,最简单的就是使用很多张包含指针的表盘图片,使用帧动画实现指针的旋转。但是如果把指针扣出来,单独进行旋转绘制,显然比载入N多张图片占用的内存要少很多。当然这样做,代码复杂度上会有所增加,这里就需要在优化内存占用与实现简易度之间进行权衡了。

    写在最后:

    设计风格很大程度上会影响到程序的内存与性能,相对来说,如果大量使用类似Material Design的风格,不仅安装包可以变小,还可以减少内存的占用,渲染性能与加载性能都会有一定的提升。
    内存优化并不就是说程序占用的内存越少就越好,如果因为想要保持更低的内存占用,而频繁触发执行gc操作,在某种程度上反而会导致应用性能整体有所下降,这里需要综合考虑做一定的权衡。
    Android的内存优化涉及的知识面还有很多:内存管理的细节,垃圾回收的工作原理,如何查找内存泄漏等等都可以展开讲很多。OOM是内存优化当中比较突出的一点,尽量减少OOM的概率对内存优化有着很大的意义。
    参考资料:

    Google I/O 2011: Memory management for Android Apps
    Managing Your App’s Memory
    Avoiding memory leaks
    Android性能优化典范 - 第3季
    Android性能优化典范 - 第2季
    Android性能优化典范
    Android性能优化之内存篇
    需要讨论直接加群,扫码直接进入!
    这里写图片描述

    展开全文
  • 有哪些让程序员受益终生的建议

    万次阅读 多人点赞 2019-10-28 07:11:59
    从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由...

    从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。

    敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!!

    一腔肺腑之言,能看进去多少,就看你自己了!!!

     

    目录:

    在校生篇:

    • 为什么要尽量进大厂?
    • 如何选择语言及方向?
    • 女生适合做开发吗?
    • 学习好真的能找得到工作吗?
    • 毕业前参加培训真的是最优解?
    • 在校生四年应该怎么过?(兼进大厂攻略)
    • 大四同学错过校招怎么办?

    社招篇:

    • 工作中真正要学到的是什么?
    • 如何外练名气,内聚实力?
    • 如何选择技术的深度与广度?
    • 如何实现财务自由?
    • 做管理真的好?
    • 社招如何进大厂?
    • 程序员的35岁真的是个坎?
    • 一些忠告

    要建议咱就弄点干货,整点鸡汤文没什么意义,为了写这篇文章,我找了几位业内小有成就的好友咨询,结合大家本身的经历和工作总结,整理了两个星期,才最终有此篇,希望能真真切切地帮到大家,原创不易,帮我点个赞吧

    在校生篇:

    一、为什么要尽量进大厂?

    虽然大厂不是想进就能进的,但建议大家还是努力进大厂,后续也会给出在大学四年要如何努力,以成功进入大厂。

    如果毕业就进了大厂,那你将得到业内大牛的指导,以及随处可见的技术碰撞。新技术的跟进也是非常快的,在这样的环境中,你的技术成长自然是非常快的。如果自己足够努力,用不了三年,你可能也将会跟他们水平差不多。

    有些同学可能会说,创业公司机会多啊,做的东西多啊,除了技术还能学到其它的东西。不错,除了技术是能学到很多东西。我们在创业时,也招过技术的同学,不光要弄技术,还要跟着我们去地推、去发传单。但这些真的是你刚毕业就应该做的吗?技术类同学在毕业后应首当把自己保命吃饭的本领练得足够好,才是刚毕业时应该做的!!!自己吃饭的本领都不够硬,那你跳槽时候,下一家凭什么给你提工资?凭你会运营,凭你发过传单?

    创业公司机会多,如果真的分红,能分给你多少?分股票真的能有你的份吗?

    就我本人而言,大学上的广西二本,在校期间也没去实习过、也没过做像样的项目,就学着用MFC做了几个小程序,自以为了不起的去广州找工作。结果,大公司没人要,小公司给的少。硬着头皮做了两个月,带我的人也是啥都不会,碰见问题问他也不理,全程自己摸。

    后来,我奋而读研,考上了中国海洋大学,毕业后进了阿里,在那里体会到了不一样的人生,同事们都很厉害,写的代码非常优秀,讲究架构与程序设计,最关键的是虽然人家厉害但人家并不轻视新人,遇到问题都是很耐心的解答,经过两年多的努力,我居然还出书了。

    这就是现实!!!!这就是差距!!!!

    二、如何选择语言及方向?

    我曾经写过一篇文章来讨论学历对计算机专业的影响程度。这也是近两年做校招和社招技术面试官的所知道的一些行业秘密,没想到非常受到大家的欢迎,发出去几天就破了千赞。

    启舰:对计算机专业来说学历真的重要吗?

    在评论与私信中,经常会有大一、大二的同学来咨询如何选择语言及方向的问题,这里再讲述下个人见解。

    首先,我们选择方向的目的是什么?不就是为了找份工作吗?那直接到招聘类网站去搜下相关的岗位数量及要求不就好了,哪个数量多,自己也喜欢,那就选这个即可。

    其次,如果是大三、大四即将毕业的同学,想知道最近哪个岗位好找工作的话。还可以看看很多培训机构的培训内容,现在很多培训机构都声称保就业,真的以为,培训几个月能培训出朵花来吗?不可能的,编程是个需要长期训练的活,几个月的培训,仅是入门而已,入门的水平能保证找份工作,就靠的是这个岗位门槛低,需求大,好找工作。

    三、女生适合做开发吗?

    单论写程序而言,程序开发适合任何人!!!但问题不是出在女生身上,是在大环境身上。出现开发岗排斥女生的主要原因有如下几点:

    • 普遍加班厉害,女生不一定吃得消
    • 抗压能力是一个重要考虑因素。开发岗经常会紧急排查问题,跟产品、测试撕X,女生爱哭,不能言辞过于犀利
    • 女生有半年产假,对于高工资的开发岗,老板会考虑这条

    当然也有一些女生的程序员,而且也做的非常好,我只是列出业界招聘时对女生开发的主观想法。但就是这些想法,致使,我在某公司招聘时,被明令要求,不能通过女生开发,确定不要!!!

    就本人而言,我也不建议女生做开发岗,君不见,三年开发,黄花闺女变成婆。

    除了开发,互联网还有很多岗位天然都是适合女生做的,比如测试、产品、运营,都是不错的选择。女生就是要美美的,不是么。。

    四、学习好真的能找得到工作吗?

    说实话,学习好,还真不一定能找得到工作。

    我大学在广西二本,当时学习很努力,以为学习好就能找得到好工作,我连续三年得国家励志奖学金,连续四年得学校一等奖学金。

    可毕业了,没有实习经历,没有项目经验,没有名校光环,根本找不到工作,去的都是屁大点的创业公司,一个月给2500,2011年的广州,都没流水线工资高。

    为什么会这样呢?因为大学里教的主要是通识教育,通识教育的意思是啥都会点,以便同学们在各个岗位都能有点基础,但当真正深入一个方向时,通识教育教你的东西是远远不够的,更多地是需要自己自学。

    所以,学习好只能说你自律、做事认真、学习能力强等优秀品质。是否能真正胜任你将要做的工作内容,还是需要打个问号的。

    但,大公司有实力,会对新人有培养计划,我所在的VIVO,有为期半年的新人培训计划,很多同学都是零基础进入岗位的,这就是名校光环!!!!校招时只要学校好、成绩好,就可能会被招进来,大公司看重的是就是你的这些优秀品质。

    但,没有名校光环,单有成绩是没用的!!!那学校不好的就没机会进大公司了吗?并不是!!!

    敲黑板!!!学校好有名校光环,学校不那么好的,还有其它光环,这些光环都可以造!!!具体看第六条“在校生四年应该怎么过?”

     

    五、毕业前参加培训真的是最优解?

    如果你是大四即将毕业的同学,深感自己没学到什么东西,那我建议你去培训下,毕竟培训是最快能入门的策略。

    如果你是大一、大二、大三的同学,你还有时间,完全可以自学,完成没必要花几万块钱去培训

    我精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,都是技术学习路上必备的经验,跟着视频学习是进步最快的,而且所有课程都有源码,直接跟着去学!!!

    只要关注微信公众号【启舰杂谈】后回复你所需方向的关键字即可,比如『Android』、『java』、『ReactNative』、『H5』、『javaweb』、『面试』、『机器学习』、『web前端』、『设计模式』等关键字获取对应资料。(所有资料免费送,转发宣传靠大家自愿)

    另外,即便参加过培训的同学在面试时,也千万不要说自己培训过!!!!

    业界对培训有偏见,因为写代码是一个逐渐学习、熟练的过程,经过几个月集中的培训,虽然看起来什么都接触到了,但真正能内化为自己知识的部分其实不多。在工作中并不能熟练运用,仅是入门水平而已。

    而且大家普遍认为参加培训的主要原因是因为,大学中没好好学,临近毕业了,催熟一把。不然,谁会花这几万块钱呢?对普通家庭而言,其实也并不是个小数目了。

    有一个外包公司的朋友,技术总监,招人时培训公司出来都不要,原因就是干活能力不行。当然这仅代表个例,但大家需要注意的是,业界并不认为培训是一件光彩的事,千万不要搞错了!!!

     

    六、在校生四年应该怎么过?(兼进大厂攻略)

    千呼万唤始出来,校招生建议最重要的部分来了!!!除了学校光环以外,我们还能自造的光环有竞赛光环、实习光环、项目光环!!!这些内容无论你是应聘大公司还是小公司都是非常有竞争力的,跟着做吧

    1、参加竞赛:

    在大学期间,有很多的算法竞赛、ACM竞赛,尽量参加全国性的,有含金量的比赛,这才能眼前一亮。

    2、参加实习

    去大公司实习,相比校招进入大公司,那是简单很多,二本学校的学生,也能进得去实习。而且在大公司都有实习生转正的机会,我所待过的公司,只要你去实习了,表现的不错,基本上100%转正。

    即便进不去大公司实习,在校招时,有实习经历,也会是简历上很重要的一项。而且一般有实习经历,就会有项目经验,这真是一举两得。

    3、增加项目经验

    如果实在没时间实习,或者实习中没做什么项目的话,那怎么办呢?在简历中最重要的就是项目经验了,如何解决呢?

    敲黑板!!!没有项目经验就造项目经验!!!!

    现在网上那么多的实战教程、github上遍地的源码分享,都可以为你所用。

    在面试时,这些项目经验都可以写上,最关键的是自己要弄通、弄会,尽量先仿一遍,自己再从头到尾自己再写一遍,把所有涉及到的知识点都弄通弄会。面试的时候,就实话实说,就说你自己仿的,没有关系,做为面试官,我们更看重的是你会啥并且你是不是真的会。

    我精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,都是技术学习路上必备的经验,跟着视频学习是进步最快的,而且所有课程都有源码,直接跟着去学!!!

    只要关注微信公众号【启舰杂谈】后回复你所需方向的关键字即可,比如『Android』、『java』、『ReactNative』、『H5』、『javaweb』、『面试』、『机器学习』、『web前端』、『设计模式』等关键字获取对应资料。(所有资料免费送,转发宣传靠大家自愿)

    在准备好了这些后,就可以开始准备校招了,参考这篇:

    启舰:大厂秋招面试官教你准备2020秋季校招

     

    七、大四同学错过校招怎么办?

    一般校招分为秋招和春招,秋招在每年9月份开始,春招一般在来年的3月份开始。所以,一般大四上学期可以参加秋招,大四下学期可以参加春招。大家参加校招要以秋招为主,因为春招主要用来补录的,岗位有限。

    有同学疑问,完美错过校招了怎么办?还能进大公司吗?

    很遗憾的告诉你,基本没办法了,校招只针对应届生,来年的校招,你是参加不了的了。

    错过校招以后,再应聘大公司就只能走社招途径。通过社招,刚毕业的同学,基本上是进不去的,因为岗位等级不一样,比如阿里,通过校招进去的同学等级是P5,通过社招进去的最低等级是P6,差了一个等级,哪有那么容易。

    不过,各个大公司社招都有毕业年限的限制,有的是毕业五年,有的是毕业三年,也就是说在毕业五年后,你就可以通过社招进去了。

    所以,现在要做的是,先找个工作,并在工作中根据下面对社招的建议,努力增加自己的光环和实力,五年后,进入大公司不要So Easy!!!

     

    如果你还有其它疑问,欢迎评论,定当回复!希望能帮到大家。


    社招篇:

    一、工作中真正要学到的是什么?

    这个问题见仁见志,可能你工作几年以后,也会有自己的看法,通过跟朋友们讨论,后来一致通过一个结论:

    工作中要保持随时可以跳槽的能力!!!这个能力包括技术能力和财务自由能力!!!

    技术能力包括外部名气和自身实力,具体方法参考“二、如何外练名气,内聚实力?”

    财务自由能力是指即便突然不工作了,是不是还有资金来源的能力。具体方法参考“四:如何选择第二职业?”

    二、如何外练名气,内聚实力?

    社招同学随着工作年限增长,学校的影响会逐渐降低。一般五年后,将基本没有影响。此时,在社会中的地位、人脉及自身实力,都对以后找工作、面试具有决定性的作用。

    名气,可以使你在圈子里有一定地位,当你的名字被大家所熟知以后,无论是面试还是机会,都是极大程度的增加,甚至会有HR争着挖你!!!

    同样地,名气和实力要匹配,德不配位,必有灾殃。技术行业也是一样,单纯混圈子,没有实质本领,在直接入职后,会对你的口碑大打折扣,互联网圈子你觉得很大吗?其实不大的,我很多同学、朋友、同事都在各大互联网企业,谁那里有点事,都是直接互通的。当然也包括你们公司的谁谁谁来我们这面试了这种八卦新闻,如果口碑不好,很多时候会有直接的影响。

    而且在收到简历时,如果你也是大公司过来的,会提前打听你的情况,如果评价不错,那这次面试基本流于形式。如果评价不好,那这次面试肯定很严格。相比面试流程,我当然更相信处了近十年的同学。

    在计算机领域有两个方法提升名气:

    (1)、Github提交MergeRequest,自造轮子

    在所有的技术面试环节,github所提交的开源项目,是一个非常能展示实力的存在,只要你在简历上写了gitHub地址,所有的技术面试官和简历筛选官,都会去看你的代码,直接看你的技术实力。

    而且它的流行程度及star量,能提升你的行业影响力,在简历上是一个非常闪光的存在。

    如果恰巧,他们的项目中有你的开源组件,那恭喜你,这次基本上过了。

    如果你的开源组件非常流行,那恭喜你,等着大公司来私信你吧。你将会被争抢,此时,谁还会再关心你的学历?

    (2)、写博客、写书

    坚持写博客,当他们经常能搜到你的博客时,就会公认你的影响力和技术实力,在计算机领域,很多人都是靠博客起来的,比如鸿洋、郭霖等等,包括我。你以为,他们一上来就能让出版社约稿?

    都是持续产出博客,博客关注者多了,出版社觉得你写得好,才会主动找你,邀请你写书的。

    写博客、写书能使你在行业有一定的地位,当他们在简历上看到你的名字时候,就会油然产生一种大牛的感觉,还在在意你的学历?

    我就是写博客、写书的受益者,在我面试VIVO时,表现的并不好,因为我创业一年,Android知识从来没复习过,很多知识都遗忘了,还没来得及复习,就让我去面试了。

    他们原以为,我是一个特别厉害的人物,安排三个技术专家同时面,结果,一问三不知。不过,最后,还是给了我OFFER。因为他们公认我的能力是足够的,只是时间过了太久,有所遗忘,拾起来就好了。相反,如果没有这个行业影响力,那这次铁定是挂了。

    内聚实力:

    前面讲了如何提升行业影响的方法,但根本的根本,还是要提升自己的实力,无论是在面试还是在工作中,都是要直面技术的,所有的外包装都会被揭穿,深入的技术学习只能靠大家自己了。

    我精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,都是技术学习路上必备的经验,跟着视频学习是进步最快的,而且所有课程都有源码,直接跟着去学!!!

    只要关注微信公众号【启舰杂谈】后回复你所需方向的关键字即可,比如『Android』、『java』、『ReactNative』、『H5』、『javaweb』、『面试』、『机器学习』、『web前端』、『设计模式』等关键字获取对应资料。(所有资料免费送,转发宣传靠大家自愿)

    视频内容非常多,总共2184G、一千六百多册电子书,九百多套视频教程,涉及43个方向。我整理了很长时间,有些资料是靠买的,希望大家能最快的提升自己。帮我点个赞吧。

    启舰:全网2184G计算机各方向视频教程/电子书汇总​

    三、如何选择技术的深度与广度?

    有些同学看到什么技术都学,搞得自己什么都懂的样子,这样在面试时,真的有优势吗?

    门门通不如一门精!!!

    做过面试官或者参与过面试的同学应该都知道,面试时,不会漫无目的的随便问。凡这么问的面试官,都是不专业的。凡有经验的面试官,会提前研究你的简历,如果你简历上有博客地址或github地址,我们都会仔细翻阅的。对于github中star量较高的源码,我们会下下来仔细研究,看它的架构及涉及技术。

    在面试时,是根据你简历中所写的技术点及项目内容,从简单到深入再到扩展,这样一个流程来面试的,考核的不是你会的广度,而是你会的内容的深度。这样考查的另一个原因在于能将面试顺利的进行下去,根据你会的内容开始,是一般面试的普遍做法!!!

    就Android而言,比如,你简历中多个项目都涉及到RecyclerView做列表,那我可能会问你,你做的列表样式是什么样子的?假若你做的样式非常炫酷。那我们可能会问,你是通过自定义LayoutManager来实现的吗?假设你回答是,那我会接着问,那回收复用是怎么实现的?RecyclerView的缓存机制是怎样的?缓存是用map还是用list来实现的?界面刷新是怎么做的?

    从界面刷新又会延伸到自定义View,就是这样一环套一环,面试官都是根据你会的内容深入了解你会的深度。所以,我们简历中每涉及一个知识,都必须搞通搞透,了解性的知识点就不要写!!

    所以正确的学习路径是:凡工作中涉及到知识点,都搞通搞透,并且将延伸性知识点加以深入研究。这样,用不了三年,你会的知识已经能够呈树状,即有一条主线,并且所有主线上涉及的知识点都已非常深入,在这条线的基础上再逐渐拓宽。

    四、如何实现财务自由?

    工作三年内的,这里不要看,好好学技术!!!

    想靠工作实现财务自由,大部分人是没有可能的!!!

    最好的办法,是在工作中做第二职业,不仅能抵御职场风险,还能有财务自由的机会,典型的案例就是stormzhang,他是我见过的唯一开着兰博基尼的程序员,人家早就财务自由不工作了,靠的就是第二职业。

    第二职业,也就是副业,兼职来做的。为什么要做第二职业,就是为了增强人生抵抗风险的能力。如果一生只把资金来源只压在工作上,万一哪天突然裁员或被辞退,资金链断裂,不能马上找得到工作的情况下,你还能支撑多久?尤其是已经成家立室的同学,那种恐惧感应该不止一次萦绕心头吧。

    在这个世界上,总共有两类职业:可预见性职业和不可预见性职业。

    可预见性职业,是指:你所做的努力所产生的价值是可预见性的,比如你兼职打烧饼,一天再努力也不可能一天收入五万。像我们工作,也是可预见性职业,你也不可能一天突然变成富翁。但可预见性职业,有一个重要特点,他跟努力强相关,虽然你不能一夜暴富,但你能通过努力使自己的收入慢慢增加。

    不可预见性职业,则是指机会成分占很大比重的职业,比如作家,累死写一本书,他也不知道是一次爆发还是依然默默无闻,像歌手,电影从业者都属于这类职业。但这类职业机会性特别强,可能你做了一年拿到的钱是你几年努力也得不到的,当然,也可能做了很长时间没一点起色。

    如果是找工作,我建议大家做可预见性职业,起码收入稳定,不会饿死。虽然不会一夜暴富,但通过努力,我们的薪资会逐渐增加,生活也能逐渐变好。

    如果是兼职,我建议大家做些不可预见性职业,有机会可以尝试做做抖音,写写软件,做做小程序等等面向普罗大众的东西,指不定哪一天突然火了,你也就永远不用工作了。

    有些同学喜欢兼职做外包,我甚是不能理解,如果他们给你股份,外包是可以做的,如果单纯的外包写代码给钱,那可能得不偿失。你浪费了这么多精力只得了一次钱,花完就不会再有了。当然,所有的不可预见性职业建议都基于温饱解决的基础上,如果你目前生活都磕磕绊绊,那还是想办法先兼职赚点钱吧,没有物质基础的梦想都是扯淡。

    这些观点,是从非常著名的一本书《黑天鹅-如何应对不可预知的未来》中学来的,我现在也做在这方面的努力,关注公众号【启舰杂谈】,回复“黑天鹅”,即可下载pdf版。

    五、做管理真的好?

    中国自古有官本位思想,觉得做了管理,就不得了了。但在技术性岗位上,真的是这样吗?

    对于技术性岗位而言,如果你两年不碰代码,那基本上你的代码能力也就废了。想要立马找一份开发的工作,基本上没有可能了。

    所以,技术性岗位可以向管理岗位转,反过来则不成立。

    大家都经历过2018、2019的裁员潮,在2018年尤为严重,很多公司一个部门一个部门的砍,而有些部门仅留几个人运维。

    而这些裁员中,首当其冲的就是纯管理,皮之不存,毛将焉附?

    而技术人员可以直接找工作,虽然难找,但耐不住岗位多。管理层呢?相对则难了很多,因为管理本身就是软实力,而且岗位少,在裁员潮到来时,管理岗更少。技术岗通过技术面试,能直接了解你的水平,管理则不同。它没办法通过面试了解你的实力,你所列举的各种成果,可能跟大环境和你所在公司有直接关系,而并不能体现你的价值。

    所以,可以做管理,但无论如何不要放弃技术。无论何时,留一个保命的本领!!!

    六、社招如何进大厂

    社招进大厂,简历先过HR,然后再过项目主管,合适了会叫来面试。

    简历过HR,一般大厂有两个筛选条件:

    • 非985/211毕业,要求毕业五年以上(或三年以上)
    • 五年(三后)以内,只考虑985/211同学

    有关学历对计算机专业的影响,这里我就不再过多赘述,有兴趣的可以看我另一篇文章:

    启舰:对计算机专业来说学历真的重要吗?​

    从上面,我们可以知道,学校本身的限制一般是毕业五年(三年)内。过了这几年能不能进大厂,就看你自己在这五年内怎么做的了,来,下面给你方法:

    1、通门路

    跳槽时有三个途径能找到工作:最佳方案是内推,其次是找猎头,最次是投简历!!!!

    (1)、靠内推

    你知道六人定律吗?就是说想认识世界上的任何一个人,最多通过六个人的桥接就可以认识!!

    这就是圈子和人脉的重要性,你有同学、朋友、同事,他们任何一个人进了大公司,都可以内推你,而且在内推时,是可以直接跳过HR,直接把简历给他们主管的。

    凡做过主管的都会有经验,不看僧面看佛面,也会给你个面试机会,会让你过来聊聊,不然,他没办法给内推你的人交待!

    所以,跟同学、朋友、同事处好关系,用得着!

    (2)、找猎头

    如果目前你还没有那些人脉,没关系,也有方案,去找猎头,猎头很好找,简历发到猎聘网,就会有猎头找你了。

    虽然猎头会跟很多大公司有合作关系,也自然能把你的简历推到大公司里,但这里有两点关键条件:

    • 需要走正规流程,先经对应公司HR筛选,再到部门主管,无跳级可能
    • 猎头看不看得上你,主要看个人简历内容,即个人实力,所以这部分还得靠自己,如何靠自己,参考“二、如何外练名气,内聚实力?”

    (3)投简历

    如果都工作五年了,你还是通过这种途径找工作的话,好好反思下吧。

    2、外练名气、内聚实力

    有了名气,能提升面试通过概率。实力,无论如何都是要有的。该部分参考”二、外练名气、内聚实力“

    3、跳槽策略

    在跳槽时,也要讲究策略,大家都知道,公司分为大小公司,但详细划分的话,其实有初创公司(20人以内),中小公司(50人以内),半大型公司(融资在B轮后,未上市的公司),上市公司。可以看到,我们想去的大厂,一般在上市公司的规模。可想而知,如果直接从初创公司面进上市公司的难度是比较大的,我们可以逐渐的,一步步的,从出创公司,跳槽进中小公司,再去稍大型的公司,最后在跳进上市企业,就相对容易了。而且,一般而言,稍大型的公司,在本地都会有些名气,面试时,别人是知道的,这一点也是能成功面试的一个因素。

    一切的一切其实都是策略,最最重要的是自己有实力,自己经历和面试过程能够让对方满意,所以,想办法提高自己的能力吧。

    七、程序员的35岁真的是个坎?

    这个话题太过沉重,专门一篇文章来写,有兴趣的可以看看。

     

    启舰:在中国程序员是青春饭吗?

     

    八、一些忠告

    1、无论有多忙,一定要健身

    程序员本就是一个高强度的职业,加班严重。网上经常会爆出来某某某猝死的新闻,我们所有的努力,不就是为了让自己和家人过上好日子么?没了我们,他们将怎么活下去?

    健身吧,为了你爱的人们。

    2、学会展现自己

    大部分公司在年中或年底都会做个人的汇报,除了这些汇报,经常可能也会有各种汇报。

    如何在汇报中展现自己的价值?

    如果你只是认为你是一颗螺丝钉,而让你的主管也这么认为的话,那你在这个公司的道路就到头了,应该不会受到重用。

    那什么样的人能受到重用?

    做事掷地有声,靠谱,并且能够表现出自己的价值。首先,主管给你的工作能不能保质保量的完成。其次,能不能主动发现问题并解决问题。另外,每做一次优化,都要想着用数据来表现,比如就应用而言,对日活提升了多少,提升了多少收入等等。

    汇报时讲究数据说话!!!!平时要注意这方面的积累,没有数据时,就通过新增埋点,提取数据!!!

    3、一定要有目标和计划!!!

    我经常会听一会社招的同学讲,工作太忙啊,没时间学习啊,苦恼啊,难受啊。

    我听到这些,只想说:

    我坚信,只要有目标和信心,凡事都可做成。最怕的就是浑浑噩噩!!!

    举个例子吧,原来在阿里时,每天早上九点上班,晚上九点下班。好处是双休。第一年,主要是学习的年份,我的目标是每周写两篇博客。看过我博客的同学都知道,凡我写的博客,都内容非常详尽,只要这篇博客要讲知识所涉及的知识点,只看我这一篇博客就够了。可想而知,我为了完整的研究这个知识,需要搜遍全网,有时需要自己研究源码,为的就是心中没有疑问。

    一篇文章一两万字,单纯靠周末两天能完成?

    不可能的,所以,为了达成目标,我每天早上6:30起床,保持7点准时到公司写博客,9点多开始上班。晚上回家,11点多睡觉,这样每天保证有两个半小时的写博客时间。这才能完成。

    很多同学问我,上班那么忙,你怎么能有那么多时间写书,靠的就是这份决心和毅力。

    现在,第二本书快写完了,开始做知乎。给自己定的目标是除了写书以外,每周出一篇知乎原创。看过我文章的朋友应该都能感觉到,我的每篇文章都是实实在在的在写,写的很用心。哪来的时间,那我告诉你,我现在在敲的这行字的时间:

    五年了,我依然每天六点半起床。

    只要你相信自己能做到,你就能做到!!!!

    4、及时总结与反思

    技术上,推荐大家写博客,把自己学习的知识点讲给别人也讲给自己。日后遗忘,不必再漫天搜资料,只需要看看自己的博客,就可以及时回到当时的水平。

    业务和项目上,每做完一个项目,都要及时反思与总结,自己哪里做的好,哪里做不好。及时更正,日后不再犯同样的错误。

    5、相信自己,勇于挑战

    很多同学在分配任务时,因为会用到自己不太了解的技术,总是不愿意接。或者项目中,有些技术调研的工作,不敢承担,总是怕做不好。

    不要怕!!!只有敢于挑战自己,才能使自己跳出舒适区,学到更多的东西。这就是为什么,有的人工作一年顶人家工作两年,而有些人工作三年了,还跟他第一年的水平一样的原因!!!

    如果你经常重复自己已经会的技术,那你的技术栈永远都是那些。只有勇于挑战,你才能在最短的时间内,学到更多的知识。并且在项目上,你的勇于挑战,别人也是看在眼里的,后面会给你更重要的任务。长此以往,你在整个项目上的技术影响力就会提升,升职加薪肯定先选你。

    6、努力靠近核心业务

    首先,靠近核心业务,能保稳定,不会突然被裁。

    大家都知道,核心业务是公司的命脉,只要公司还在,核心业务就会在,而且变动性不大。

    其次,核心业务上出的成绩容易被放大。

    自然是因为它是公司的核心,所有资源都会向它靠拢,争取协作资源容易。而且,所有人都关注它,一旦在核心业务上做了一些成果,就会被全部人所知,当然包括你的老板,升职加薪更容易。

     

    如果你还有其它疑问,欢迎评论,定当回复!希望能帮到大家。记得帮我点赞哦。

     

    推荐阅读

    职业相关:

    启舰:克服这些「学生思维」,离职场达人更进一步

    启舰:程序员如何在面试中牵着面试官鼻子走?

    启舰:揭密!大厂招聘内幕!你真的能进大厂?

     

    校招相关:

    应届生如何跟踪校招信息?

    你的 2020 秋招进展怎么样了?

     

    其它内容:

    学习flutter需要先学习安卓原生吗?

    启舰:安卓已死?我们的未来在哪里​

     

    本人所有文章均受版权保护平台签约保护,著作权归启舰所有,未经授权,转载必究,谢谢合作。

    展开全文
  • Android 性能优化四个方面总结

    千次阅读 2018-12-17 16:56:49
    目录一、四个方面二、卡顿优化1、Android系统显示原理2、卡顿根本原因3、性能分析工具(1)Profile GPU Rendering(2)TraceView(3)Systrace UI 性能分析4、优化建议(1)布局优化(2)避免过度绘制(3)启动优化...

    一、四个方面

    可以把用户体验的性能问题主要总结为4个类别:

    • 流畅

    • 稳定

    • 省电、省流量

    • 安装包小

    性能问题的主要原因是什么,原因有相同的,也有不同的,但归根到底,不外乎内存使用、代码效率、合适的策略逻辑、代码质量、安装包体积这一类问题,整理归类如下:
    在这里插入图片描述
    从图中可以看到,打造一个高质量的应用应该以4个方向为目标:快、稳、省、小。

    • :使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望。

    • :减低 crash 率和 ANR 率,不要在用户使用过程中崩溃和无响应。

    • :节省流量和耗电,减少用户使用成本,避免使用时导致手机发烫。

    • :安装包小可以降低用户的安装成本。

    要想达到这4个目标,具体实现是在右边框里的问题:卡顿、内存使用不合理、代码质量差、代码逻辑乱、安装包过大,这些问题也是在开发过程中碰到最多的问题,在实现业务需求同时,也需要考虑到这点,多花时间去思考,如何避免功能完成后再来做优化,不然的话等功能实现后带来的维护成本会增加。

    二、卡顿优化

    Android 应用启动慢,使用时经常卡顿,是非常影响用户体验的,应该尽量避免出现。卡顿的场景有很多,按场景可以分为4类:UI 绘制、应用启动、页面跳转、事件响应,如图:
    在这里插入图片描述

    这4种卡顿场景的根本原因可以分为两大类:

    • 界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在UI和启动后的初始界面以及跳转到页面的绘制上。

    • 数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理UI线程,二是数据处理占用CPU高,导致主线程拿不到时间片,三是内存增加导致GC频繁,从而引起卡顿。

    引起卡顿的原因很多,但不管怎么样的原因和场景,最终都是通过设备屏幕上显示来达到用户,归根到底就是显示有问题,所以,要解决卡顿,就要先了解Android系统的显示原理。

    1、Android系统显示原理

    Android显示过程可以简单概括为:Android应用程序把经过测量、布局、绘制后的Surface缓存数据,通过SurfaceFlinger把数据渲染到显示屏幕上, 通过Android的刷新机制来刷新数据。也就是说应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层服务通过刷新机制把数据更新到屏幕上

    我们都知道在Android的每个View绘制中有三个核心步骤:Measure、Layout、Draw。具体实现是从 ViewRootImp类的performTraversals() 方法开始执行,Measure和Layout都是通过递归来获取View的大小和位置,并且以深度作为优先级,可以看出 层级越深、元素越多、耗时也就越长

    真正把需要显示的数据渲染到屏幕上,是通过系统级进程中的SurfaceFlinger服务来实现的,那么这个SurfaceFlinger服务主要做了哪些工作呢?如下:

    • 响应客户端事件,创建Layer与客户端的Surface建立连接。

    • 接收客户端数据及属性,修改Layer属性,如尺寸、颜色、透明度等。

    • 将创建的Layer内容刷新到屏幕上。

    • 维持Layer的序列,并对Layer最终输出做出裁剪计算。

    既然是两个不同的进程,那么肯定是需要一个跨进程的通信机制来实现数据传递,在Android显示系统中,使用了Android的匿名共享内存:SharedClient,每一个应用和SurfaceFlinger之间都会创建一个SharedClient ,然后在每个SharedClient中,最多可以创建31个 SharedBufferStack,每个Surface都对应一个SharedBufferStack,也就是一个Window。

    一个SharedClient对应一个Android应用程序,而一个Android应用程序可能包含多个窗口,即Surface。也就是说SharedClient包含的是SharedBufferStack的集合,其中在显示刷新机制中用到了双缓冲和三重缓冲技术。最后总结起来显示整体流程分为三个模块:应用层绘制到缓存区,SurfaceFlinger把缓存区数据渲染到屏幕,由于是不同的进程,所以使用Android的匿名共享内存SharedClient缓存需要显示的数据来达到目的。

    除此之外,我们还需要一个名词:FPS。FPS表示每秒传递的帧数在理想情况下,60FPS就感觉不到卡,这意味着每个绘制时长应该在16ms以内。但是 Android系统很有可能无法及时完成那些复杂的页面渲染操作。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需的60FPS。如果某个操作花费的时间是24ms ,系统在得到VSYNC信号时就无法正常进行正常渲染,这样就发生了丢帧现象。那么用户在32ms内看到的会是同一帧画面,这种现象在执行动画或滑动列表比较常见,还有可能是你的Layout太过复杂,层叠太多的绘制单元,无法在16ms完成渲染,最终引起刷新不及时。

    2、卡顿根本原因

    根据Android系统显示原理可以看到,影响绘制的根本原因有以下两个方面:

    • 绘制任务太重,绘制一帧内容耗时太长

    • 主线程太忙,根据系统传递过来的VSYNC信号来时还没准备好数据导致丢帧

    绘制耗时太长,有一些工具可以帮助我们定位问题。主线程太忙则需要注意了,主线程关键职责是处理用户交互,在屏幕上绘制像素,并进行加载显示相关的数据,所以特别需要避免任何主线程的事情,这样应用程序才能保持对用户操作的即时响应。总结起来,主线程主要做以下几个方面工作:

    • UI生命周期控制

    • 系统事件处理

    • 消息处理

    • 界面布局

    • 界面绘制

    • 界面刷新

    除此之外,应该尽量避免将其他处理放在主线程中,特别复杂的数据计算和网络请求等。

    3、性能分析工具

    性能问题并不容易复现,也不好定位,但是真的碰到问题还是需要去解决的,那么分析问题和确认问题是否解决,就需要借助相应的的调试工具,比如查看Layout层次的Hierarchy View、Android系统上带的GPU Profile工具和静态代码检查工具Lint等,这些工具对性能优化起到非常重要的作用,所以要熟悉,知道在什么场景用什么工具来分析。

    (1)Profile GPU Rendering

    在手机开发者模式下,有一个卡顿检测工具叫做:Profile GPU Rendering,如图:
    在这里插入图片描述

    它的功能特点如下:

    • 一个图形监测工具,能实时反应当前绘制的耗时

    • 横轴表示时间,纵轴表示每一帧的耗时

    • 随着时间推移,从左到右的刷新呈现

    • 提供一个标准的耗时,如果高于标准耗时,就表示当前这一帧丢失

    (2)TraceView

    TraceView是Android SDK自带的工具,用来分析函数调用过程,可以对Android的应用程序以及Framework层的代码进行性能分析。它是一个图形化的工具,最终会产生一个图表,用于对性能分析进行说明,可以分析到每一个方法的执行时间,其中可以统计出该方法调用次数和递归次数,实际时长等参数维度,使用非常直观,分析性能非常方便。

    (3)Systrace UI 性能分析

    Systrace是Android 4.1及以上版本提供的性能数据采样和分析工具,它是通过系统的角度来返回一些信息。它可以帮助开发者收集Android关键子系统,如Surfaceflinger、WindowManagerService等Framework部分关键模块、服务、View系统等运行信息,从而帮助开发者更直观地分析系统瓶颈,改进性能。Systrace的功能包括跟踪系统的I/O操作、内核工作队列、CPU负载等,在UI显示性能分析上提供很好的数据,特别是在动画播放不流畅、渲染卡等问题上。

    4、优化建议

    • 布局优化
    • 避免过度绘制
    • 启动优化
    • 合理的刷新机制
    • 其他

    (1)布局优化

    布局是否合理主要影响的是页面测量时间的多少,我们知道一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h有关,其时间复杂度O(h),如果层级太深,每增加一层则会增加更多的页面显示时间,所以布局的合理性就显得很重要。

    那布局优化有哪些方法呢,主要通过 减少层级、减少测量和绘制时间、提高复用性 三个方面入手。总结如下:

    • 减少层级:合理使用RelativeLayout和LinerLayout,合理使用Merge。

    • 提高显示速度:使用ViewStub,它是一个看不见的、不占布局位置、占用资源非常小的视图对象。

    • 布局复用:可以通过标签(include)来提高复用。

    • 尽可能少用wrap_content:wrap_content 会增加布局measure时计算成本,在已知宽高为固定值时,不用wrap_content。

    • 其他:删除控件中无用的属性。

    (2)避免过度绘制

    过度绘制是指在屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的UI结构中,如果不可见的UI也在做绘制的操作,就会导致某些像素区域被绘制了多次,从而浪费了多余的CPU以及GPU源。

    如何避免过度绘制呢,如下:

    • 布局上的优化:移除XML中非必须的背景,移除Window默认的背景、按需显示占位背景图片。

    • 自定义View优化:使用 canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。

    (3)启动优化

    通过对启动速度的监控,发现影响启动速度的问题所在,优化启动逻辑,提高应用的启动速度。启动主要完成三件事:UI布局、绘制和数据准备。因此启动速度优化就是需要优化这三个过程:

    • UI布局:应用一般都有闪屏页,优化闪屏页的UI布局,可以通过Profile GPU Rendering检测丢帧情况。

    • 启动加载逻辑优化:可以采用分布加载、异步加载、延期加载策略来提高应用启动速度。

    • 数据准备:数据初始化分析,加载数据可以考虑用线程初始化等策略。

    (4)合理的刷新机制

    在应用开发过程中,因为数据的变化,需要刷新页面来展示新的数据,但频繁刷新会增加资源开销,并且可能导致卡顿发生,因此,需要一个合理的刷新机制来提高整体的UI流畅度。合理的刷新需要注意以下几点:

    • 尽量减少刷新次数

    • 尽量避免后台有高的CPU线程运行

    • 缩小刷新区域

    (5)其他

    在实现动画效果时,需要根据不同场景选择合适的动画框架来实现。有些情况下,可以用硬件加速方式来提供流畅度。

    三、内存优化

    在Android系统中有个垃圾内存回收机制,在虚拟机层自动分配和释放内存,因此不需要在代码中分配和释放某一块内存,从应用层面上不容易出现内存泄漏和内存溢出等问题,但是需要内存管理。Android系统在内存管理上有一个Generational Heap Memory模型,内存回收的大部分压力不需要应用层关心,Generational Heap Memory有自己一套管理机制,当内存达到一个阈值时,系统会根据不同的规则自动释放系统认为可以释放的内存,也正是因为Android程序把内存控制的权力交给了Generational Heap Memory,一旦出现内存泄漏和溢出方面的问题,排查错误将会成为一项异常艰难的工作。除此之外,部分Android应用开发人员在开发过程中并没有特别关注内存的合理使用,也没有在内存方面做太多的优化,当应用程序同时运行越来越多的任务,加上越来越复杂的业务需求时,完全依赖Android的内存管理机制就会导致一系列性能问题逐渐呈现,对应用的稳定性和性能带来不可忽视的影响,因此,解决内存问题和合理优化内存是非常有必要的。

    1、Android内存管理机制

    Android应用都是在 Android的虚拟机上运行,应用 程序的内存分配与垃圾回收都是由虚拟机完成的。在Android系统,虚拟机有两种运行模式:Dalvik和ART。

    (1)Java对象生命周期

    在这里插入图片描述
    一般Java对象在虚拟机上有7个运行阶段:

    创建阶段->应用阶段->不可见阶段->不可达阶段->收集阶段->终结阶段->对象空间重新分配阶段

    (2)内存分配

    在Android系统中,内存分配实际上是对堆的分配和释放。当一个Android程序启动,应用进程都是从一个叫做Zygote的进程衍生出来,系统启动 Zygote 进程后,为了启动一个新的应用程序进程,系统会衍生Zygote进程生成一个新的进程,然后在新的进程中加载并运行应用程序的代码。其中,大多数的RAM pages被用来分配给Framework代码,同时促使RAM资源能够在应用所有进程之间共享。

    但是为了整个系统的内存控制需要,Android系统会为每一个应用程序都设置一个硬性的Dalvik Heap Size最大限制阈值,整个阈值在不同设备上会因为RAM大小不同而有所差异。如果应用占用内存空间已经接近整个阈值时,再尝试分配内存的话,就很容易引起内存溢出的错误。

    (3)内存回收机制

    我们需要知道的是,在Java中内存被分为三个区域:Young Generation(新生代)、Old Generation(年老代)、Permanent Generation(持久代)。最近分配的对象会存放在Young Generation区域。对象在某个时机触发GC回收垃圾,而没有回收的就根据不同规则,有可能被移动到Old Generation,最后累积一定时间在移动到Permanent Generation 区域。系统会根据内存中不同的内存数据类型分别执行不同的GC操作。GC通过确定对象是否被活动对象引用来确定是否收集对象,进而动态回收无任何引用的对象占据的内存空间。但需要注意的是频繁的GC会增加应用的卡顿情况,影响应用的流畅性,因此需要尽量减少系统GC行为,以便提高应用的流畅度,减小卡顿发生的概率。

    2、内存分析工具

    做内存优化前,需要了解当前应用的内存使用现状,通过现状去分析哪些数据类型有问题,各种类型的分布情况如何,以及在发现问题后如何发现是哪些具体对象导致的,这就需要相关工具来帮助我们。

    (1)Memory Monitor

    Memory Monitor是一款使用非常简单的图形化工具,可以很好地监控系统或应用的内存使用情况,主要有以下功能:

    • 显示可用和已用内存,并且以时间为维度实时反应内存分配和回收情况。

    • 快速判断应用程序的运行缓慢是否由于过度的内存回收导致。

    • 快速判断应用是否由于内存不足导致程序崩溃。

    (2)Heap Viewer

    Heap Viewer的主要功能是查看不同数据类型在内存中的使用情况,可以看到当前进程中的Heap Size的情况,分别有哪些类型的数据,以及各种类型数据占比情况。通过分析这些数据来找到大的内存对象,再进一步分析这些大对象,进而通过优化减少内存开销,也可以通过数据的变化发现内存泄漏。

    (3)Allocation Tracker

    Memory Monitor和Heap Viewer都可以很直观且实时地监控内存使用情况,还能发现内存问题,但发现内存问题后不能再进一步找到原因,或者发现一块异常内存,但不能区别是否正常,同时在发现问题后,也不能定位到具体的类和方法。这时就需要使用另一个内存分析工具Allocation Tracker,进行更详细的分析,Allocation Tracker可以分配跟踪记录应用程序的内存分配,并列出了它们的调用堆栈,可以查看所有对象内存分配的周期。

    (4)Memory Analyzer Tool(MAT)

    MAT是一个快速,功能丰富的Java Heap分析工具,通过分析Java进程的内存快照HPROF分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象。

    3、常见内存泄漏场景

    如果在内存泄漏发生后再去找原因并修复会增加开发的成本,最好在编写代码时就能够很好地考虑内存问题,写出更高质量的代码,这里列出一些常见的内存泄漏场景,在以后的开发过程中需要避免这类问题。

    • 资源性对象未关闭:比如Cursor、File文件等,往往都用了一些缓冲,在不使用时,应该及时关闭它们。

    • 注册对象未注销:比如事件注册后未注销,会导致观察者列表中维持着对象的引用。

    • 类的静态变量持有大数据对象

    • 非静态内部类的静态实例

    • Handler临时性内存泄漏:如果Handler是非静态的,容易导致Activity或Service不会被回收。

    • 容器中的对象没清理造成的内存泄漏

    • WebView:WebView存在着内存泄漏的问题,在应用中只要使用一次WebView,内存就不会被释放掉。

    除此之外,内存泄漏可监控,常见的就是用LeakCanary第三方库,这是一个检测内存泄漏的开源库,使用非常简单,可以在发生内存泄漏时告警,并且生成leak tarce分析泄漏位置,同时可以提供Dump文件进行分析。

    4、优化内存空间

    没有内存泄漏,并不意味着内存就不需要优化,在移动设备上,由于物理设备的存储空间有限,Android 系统对每个应用进程也都分配了有限的堆内存,因此使用最小内存对象或者资源可以减小内存开销,同时让GC 能更高效地回收不再需要使用的对象,让应用堆内存保持充足的可用内存,使应用更稳定高效地运行。常见做法如下:

    • 对象引用:强引用、软引用、弱引用、虚引用四种引用类型,根据业务需求合理使用不同,选择不同的引用类型。

    • 减少不必要的内存开销:注意自动装箱,增加内存复用,比如有效利用系统自带的资源、视图复用、对象池、Bitmap对象的复用。

    • 使用最优的数据类型:比如针对数据类容器结构,可以使用ArrayMap数据结构,避免使用枚举类型,使用缓存Lrucache等等。

    • 图片内存优化:可以设置位图规格,根据采样因子做压缩,用一些图片缓存方式对图片进行管理等等。

    四、稳定性优化

    Android应用的稳定性定义很宽泛,影响稳定性的原因很多,比如内存使用不合理、代码异常场景考虑不周全、代码逻辑不合理等,都会对应用的稳定性造成影响。其中最常见的两个场景是:Crash和ANR,这两个错误将会使得程序无法使用,比较常用的解决方式如下:

    • 提高代码质量:比如开发期间的代码审核,看些代码设计逻辑,业务合理性等。

    • 代码静态扫描工具:常见工具有Android Lint、Findbugs、Checkstyle、PMD等等。

    • Crash监控:把一些崩溃的信息,异常信息及时地记录下来,以便后续分析解决。

    • Crash上传机制:在Crash后,尽量先保存日志到本地,然后等下一次网络正常时再上传日志信息。

    五、耗电优化

    在移动设备中,电池的重要性不言而喻,没有电什么都干不成。对于操作系统和设备开发商来说,耗电优化一致没有停止,去追求更长的待机时间,而对于一款应用来说,并不是可以忽略电量使用问题,特别是那些被归为“电池杀手”的应用,最终的结果是被卸载。因此,应用开发者在实现需求的同时,需要尽量减少电量的消耗。

    在Android5.0以前,在应用中测试电量消耗比较麻烦,也不准确,5.0之后专门引入了一个获取设备上电量消耗信息的API:Battery Historian。Battery Historian是一款由Google提供的Android系统电量分析工具,和Systrace一样,是一款图形化数据分析工具,直观地展示出手机的电量消耗过程,通过输入电量分析文件,显示消耗情况,最后提供一些可供参考电量优化的方法。

    除此之外,还有一些常用方案可提供:

    • 计算优化,避开浮点运算等

    • 避免WaleLock使用不当

    • 使用Job Scheduler

    六、安装包大小优化

    应用安装包大小对应用使用没有影响,但应用的安装包越大,用户下载的门槛越高,特别是在移动网络情况下,用户在下载应用时,对安装包大小的要求更高,因此,减小安装包大小可以让更多用户愿意下载和体验产品。

    常用应用安装包的构成,如图所示:
    在这里插入图片描述

    从图中我们可以看到:

    • assets文件夹:存放一些配置文件、资源文件,assets不会自动生成对应的 ID,而是通过AssetManager类的接口获取。

    • res:res是resource的缩写,这个目录存放资源文件,会自动生成对应的ID并映射到 .R文件中,访问直接使用资源ID。

    • META-INF:保存应用的签名信息,签名信息可以验证APK文件的完整性。

    • AndroidManifest.xml:这个文件用来描述Android应用的配置信息,一些组件的注册信息、可使用权限等。

    • classes.dex:Dalvik字节码程序,让Dalvik虚拟机可执行,一般情况下,Android应用在打包时通过Android SDK中的dx工具将Java字节码转换为Dalvik字节码。

    • resources.arsc:记录着资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。

    减少安装包大小的常用方案:

    • 代码混淆:使用ProGuard代码混淆器工具,它包括压缩、优化、混淆等功能。

    • 资源优化:比如使用Android Lint删除冗余资源,资源文件最少化等。

    • 图片优化:比如利用AAPT工具对PNG格式的图片做压缩处理,降低图片色彩位数等。

    • 避免重复功能的库,使用WebP图片格式

    • 插件化:比如功能模块放在服务器上,按需下载,可以减少安装包大小。

    展开全文
  • 最近很多朋友问我们(FloatLic)浮点许可优化管理软件是通过怎样的方式去监控管理浮动许可服务器的,会不会改变浮动许可管理器的获取机制?部署以后会不会导致许可服务器异常?监控方式安全吗?等一系列问题进行...

    最近有很多朋友问我们(FloatLic)浮点许可优化管理软件是通过怎样的方式去监控管理浮动许可服务器的,会不会改变浮动许可管理器的获取机制?部署以后会不会导致许可服务器异常?监控方式安全吗?等一系列问题进行说明。

     

    我们先看浮动许可管理器正常获取流程:

     

    企业许可服务器管理现状:

    1、多个软件厂商专业软件没办法统一进行管理;

    2、无法实时获取每台许可服务器license使用情况;

    3、无法实时获取当前有哪些用户在用license及使用时长;

    4、无法第一时间获取许可服务器异常状态;

    5、用户获取不到license时,无法统一进行统计每个软件模块使用紧张程度等;

    6、license使用紧张时无法进行license优化。


     

    我们再看(FloatLic)浮点许可优化管理软件监控流程:

    解析图  

     

    浮点许可优化管理软件部署完成后,管理员可以通过同一网络下任意WEB页面进行集中监控管理每台服务器软件、模块及用户获取license的使用记录,无需在每次单个服务器去登陆查找,极大节省管理许可服务器时间。

     

    通过浮点许可优化管理软件监控后:


     

    1、支持多个专业软件许可服务器进行集中管理;

    2、支持获取软件模块实时使用率;

    3、支持获取每个软件模块当前在线用户及本次获取许可时长;

    4、支持查看当前许可服务器状态(异常及时通知管理员);

    5、支持用户获取不到license时产生拒绝记录进行统计分析;

    6、支持查看每个软件、用户历史使用数据统计分析;

    7、支持license优化,提高license利用率;

    8、根据历史数据智能预测未来软件使用缺口增加建议。


     

    浮点许可优化管理软件可以部署在企业任意一台服务器上,在同一个网络上的(互联网、局域网)许可服务器均支持集中监控,浮点许可优化管理软件采用旁路模式进行管理管控,就算浮点许可优化管理软件服务异常或机器宕机,也不会影响已占用license用户的正常作业。浮点许可优化管理软件更不会去改变或修改原有license获取方式。

    浮点许可优化管理软件部署方便、操作简单、提供数据报表支持、license优化效果显著、安全稳定,是企业管理昂贵的许可资源必不可少的工具。

    如果您有专业软件license使用问题或管理方面需求,欢迎联系我们沟通交流。

    展开全文
  • OnTrimMemoryOnTrimMemory 回调是 Android 4.0 之后提供的一个API,这个 API 是提供给开发者的,它的主要作用是提示...本文通过问答的方式,从各个方面来讲解 OnTrimMemory 回调的使用过程和效果。想要开发高性能且用户
  • unity几种优化建议

    千次阅读 2016-10-14 16:28:20
    最简单的优化建议: 1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU。 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unlit目录下的。它们更...
  • 【转载】Unity 项目管理优化

    千次阅读 2017-12-01 09:26:35
    不论是对于Unity初学者还是极经验的开发者来说,项目设计与管理都是迟早需要接触并掌握的知识点。本文将由Unity技术支持工程师田彪,为大家详细全面地介绍Unity项目设计与管理的系统知识。全文分为五大块,大家挑...
  • IHS配置优化建议

    千次阅读 2016-05-08 15:46:41
    HIS实际上是IBM和Apache合作的一个产物,它基于稳定版的Apache webserver代码树,然后做了一些扩展,优化而来,所以在本质上各个参数和Apache webserver基本上是一样的,如下就从四个方面对HIS配置进行优化建议: ...
  • MySQL优化技术——20条建议

    万次阅读 2018-10-12 10:06:21
    不仅是DBA(数据库管理员)不得不担心这些性能问题。作为程序员,我们需要通过正确地构造表、编写优化的查询和更好的代码来完成我们的工作。在本文中,我将列出一些针对程序员的MySQL优化技术。   1.优化查询缓存...
  • Oracle:SQL优化建议

    千次阅读 2018-06-14 13:49:34
    Oracle:SQL优化建议 下述为34条Oracle中SQL的优化建议,仅供参考。 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的...
  • jQuery性能优化的28个建议

    万次阅读 2012-03-01 08:23:33
    我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些。找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来 一、选择器性能优化建议 1. 总是从#id选择器来继承...
  • SQL数据库优化方面的经验

    万次阅读 2016-08-29 10:42:51
    2、外键约束会影响插入和删除性能,如果程序能够保证数据完整性,在设计数据库时就去掉外键。 3、表中允许适当冗余。 4、sql语句全部大写,特别是列名和表名全部大写。特别是sql命令的缓存功能,更加需要统一大小...
  • Oracle DB 通过SQL 优化管理性能

    千次阅读 2013-10-25 16:11:37
    • 将SQL 优化指导用于: – 确定使用资源最多的 SQL 语句 – 优化使用资源最多的 SQL 语句 • 使用SQL 访问指导优化工作量 SQL 优化 SQL 优化进程 • 确定没有很好地优化的SQL 语句。 • 优化各条语句。 • ...
  • 史上最强Tomcat8性能优化

    万次阅读 多人点赞 2019-10-25 15:33:32
    文章目录授人以鱼不如授人以渔目的服务器资源Tomcat配置优化Linux环境安装运行Tomcat8AJP连接执行器(线程池)3种运行模式部署测试用的web项目查看服务器信息部署web应用使用Apache JMeter进行性能测试下载安装修改...
  • ASP.NET网站优化之-论网站访问优化的重要性!
  • 基于网上的技术文章思路,自己加以整理,常用的和不常用的策略,供参考。nginx的优化1. gzip压缩优化 2. expires缓存还 3. 网络IO事件模型优化 4. 隐藏软件名称和版本号 5. 防盗链优化 6. 禁止恶意域名...
  • 信息系统管理建议

    千次阅读 2018-03-11 10:48:30
    关于信息系统管理建议公司正在同时进行信息系统再造升级,和供应链流程优化工作。由于这两个项目都是高投入、重维护的系统工程,这是契机,更是挑战,如何处理好这两项对于公司未来的全球性发展是不可或缺的支持性...
  • 【redis】redis内存管理、淘汰机制、内存优化

    千次阅读 多人点赞 2020-08-25 12:44:21
    redis内存管理、淘汰机制、内存优化
  • 前言 在 Android开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高... 文章较长,建议预留较长时间阅读 / 收藏 目录 1. 性能优化的目的 性能优化...
  • 如何改善和优化ERP流程管理

    千次阅读 2008-11-27 19:01:00
    众所周知,ERP流程管理优化是ERP项目中的核心环节,也是ERP项目的关键所在。很多人就会问了,ERP的流程优化做到什么样的阶段,才成功呢?个人认为,企业流程的改善是没有终点的,其是一个持续完善的过程。不过,...
  • 这篇文章主要介绍在实际Android应用程序的开发中,容易导致内存泄露的一些情况。...本文从Android开发中的资源使用情况入手,介绍了如何在Bitmap、数据库查询、9-patch、过渡绘制等方面优化内存
  • H5性能测试(优化建议

    千次阅读 2018-01-12 10:36:21
    移动设备需要接受服务器的任务,所以我们需要一个app可以支持任务的管理和测试数据的采集。这里的移动设备通过USB数据线连接在服务器上,所以,使用am命令就可以轻松操控app。 03 请移动设备如何获取...
  • 一些Unity 优化建议 整理(为自己)

    千次阅读 2016-07-13 16:08:53
    1、 由于实时对战游戏的数据包数量巨大,早期版本的帧同步策略会导致比较明显的卡顿,通过进行数据包的合并与优化逐渐解决了卡顿问题; 2、 频繁创建和销毁的小兵对象让CPU爆表了,大量的小兵如果采用实时内存的分配...
  • 前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的... 缺乏管理,从而出现 内存泄露(ML)、内存溢出(OOM)、内存空间占用过大 等问题,最终导致应用程序崩溃(Crash) 3. 储备知识:A...
  • 面试官:关于Java性能优化,你什么技巧

    万次阅读 多人点赞 2019-11-27 10:13:05
    一般两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的...
  • Android 性能优化之数据库优化(一)

    千次阅读 2016-09-12 10:26:41
    Android 性能优化之数据库优化(一)
  • 原文:http://www.jianshu.com/p/9755da0f4e8f说到Android系统手机,大...,才感觉运行速度稍微提高了点,就算手机在各种性能跑分软件面前分数遥遥领先,还是感觉无论多大的内存空间都远远不够用。相信每个使用...
  • 管理Java垃圾回收的五个建议

    千次阅读 2016-03-23 17:08:17
    本文作者是Niv Steingarten,是Takipi 的...作者通过对垃圾收集器的介绍和梳理,在管理垃圾回收方面提出了五个建议,降低收集器开销,帮助大家进一步提升项目性能。本文系国内 ITOM 管理平台 OneAPM 工程师编译整理。
  • 每台redis的服务器的内存都是有限的...而且redis的实现并没有在内存这块做太多的优化,所以实现者为了防止内存过于饱和,采取了一些措施来管控内存。 这其中就涉及内存淘汰机制,内存使用正确姿势,内存优化的注意点。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 161,221
精华内容 64,488
关键字:

优化管理方面有哪些建议