网络公司要求做网站工商网监,营销网络怎么写,能和实体彩票店和做的彩票网站,大气简约企业网站模板文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收#xff08;1#xff09;引用计数法和可达性分析法#xff08;2#xff09;五种对象引用#xff08;3#xff09;垃圾回收算法 一、C/C的内存管理
在C和C没有自动垃圾回收机制#xff0c;一个对象… 文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收1引用计数法和可达性分析法2五种对象引用3垃圾回收算法 一、C/C的内存管理
在C和C没有自动垃圾回收机制一个对象如果不在使用需用手动释放否则会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收内存泄漏的积累可能会导致内存溢出。
二、Java的内存管理
Java为了简化对象释放引入了自动的垃圾回收Garbage Collection简称GC机制。通过垃圾回收器来对不再使用的对象完成自动的回收垃圾回收器主要负责对堆上的内存进行回收。其他很多现代语言比如C#、Python、Go都拥有自己的垃圾回收器。
1、方法去的回收
方法区中能回收的内容主要是不再使用的类。判定一个类可以被卸载需要同时满足下面三个条件
此类所有实例对象都已经被回收在堆中不存在任何该类的实例对象以及子类对象。加载该类的类加载器已经被回收。该类对应的java.lang.Class对象没有任何地方被引用。
手动触发回收
如果需要手动触发垃圾回收可以调用System.gc()方法。语法System.gc()。注意事项调用System.gc()方法并不一定会立即回收垃圾仅仅是向Java虚拟机发送一个垃圾回收的请求具体是否需要执行垃圾回收Java虚拟机会自动判断。
打印类的加载和卸载信息配置
-XX:TraceClassLoading-XX:TraceClassUnloading
2、堆回收
Java中对象是否能被回收是根据对象是否被引用来决定的。如果对象被引用了说明改对象还在使用不允许被回收。只有无法通过引用获取到对象时该对象才能被回收。
-verbose:gc打印垃圾回收日志
1引用计数法和可达性分析法
引用计数法
引用计数法会为每个对象维护一个引用计数器当对象被引用时加1取消引用时减1。引用计数法的优点是实现简单C中的智能指针就采用了引用计数法但是它也存在缺点主要有两点每次引用和取消引用都需要维护计数器对系统性能会有一定的影响。存在循环引用问题所谓循环引用就是当A引用BB同时引用A时会出现对象无法回收的问题。
可达性分析法
Java使用的是可达性分析算法来判断对象是否可以被回收。可达性分析将对象分为两类垃圾回收的根对象GC Root和普通对象对象与对象之间存在引用关系。哪些对象可以作为GC Root: 线程Thread对象引用线程栈帧中的方法参数、局部变量等。系统类加载器加载的java.lang.Class对象。监视器对象用来保存同步锁synchronized关键字持有的对象。本地方法调用时使用的全局对象。
查看GC Root 通过arthas和eclipse Memory AnalyzerMAT工具可以查看GC RootMAT工具是eclipse推出的Java堆内存检测工具。具体操作步骤如下
使用arthas的heapdump命令将堆内存快照保存到本地磁盘中。使用MAT工具打开堆内存快照文件。选择GC Roots功能查看所有的GC Root。
2五种对象引用
可达性算法中描述的对象引用一般指的是强引用即是GC Root对象堆普通对象有引用关系只要这层关系存在普通对象就不会被回收。除了强引用之外Java中还设计了几种其他引用方式
软引用 软引用相对于强引用时一种比较弱的引用关系如果一个对象只有软引用关联到它当程序内存不足时就会将软引用中的数据进行回收。在JDK1.2版本之后提供了SoftReference类来实现软引用软引用常用于缓存中。执行过程如下 将对象使用软引用包装起来new SoftReference对象类型(对象)。内存不足时虚拟机尝试进行垃圾回收。如果垃圾回收仍不能解决内存不足的问题回收软引用中的对象。如果仍然内存不足抛出OutOfMemory异常。
软引用中的对象如果在内存不足时回收SoftReference对象本身也需要被回收。如何知道哪些SoftReference对象需要回收呢SoftReference提供了一套队列机制 软引用创建时通过构造器传入引用队列。 在软引用中包含的对象被回收时该软引用对象会被放入引用队列。 通过遍历引用队列将SoftRference的强引用删除。 弱引用 包含的对象在垃圾回收时不管内存够不够都会直接被回收。在JDK1.2版本之后提供了WeakReference类来实现弱引用弱引用主要在ThreadLocal中使用。弱引用本身也可以使用引用队列进行回收。 虚引用 虚引用也叫幽灵引用/幻影引用不能通过虚引用对象获取到包含的对象。虚引用唯一的用途是当对象被垃圾回收器回收时可以接收到对应的通知。Java中使用PhantomReference实现了虚引用直接内存中为了及时知道直接内存对象不在使用从而回收内存使用了虚引用来实现。 终结器引用 指的是对象需要被回收时对象将会被放置在Finalizer类中的引用队列中并在稍后由一条由FinalizerThread线程从队列中获取对象然后执行对象的finalize方法。在这个过程中可以在finalize方法中再将自身对象使用强引用关联上但是不建议这样做如果耗时过长会影响其他对象的回收。
3垃圾回收算法
垃圾回收算法的历史和分类
1960年John McCarthy发布了第一个GC算法标记-清除算法。1963年Marvin L.Minsky发布了复制算法。 本质上后续所有的垃圾回收算法都是在上述两种算法的基础上优化而来。 Java垃圾回收过程会通过单独的GC线程来完成但是不管使用哪种GC算法都会有部分阶段需要停止所有的用户线程。这个过程被称为Stop The World简称STW如果STW时间过程则会影响用户的使用。
垃圾回收算法的评价标准 吞吐量 吞吐量值得是CPU用于执行用户代码的时间与CPU总执行的时间比值。吞吐量越高垃圾回收的效率越高。 最大停顿时间 指的是垃圾回收过程中STW时间最大值。
标记清除算法
标记阶段将所有存活的对象进行标记。Java中使用可达性分析算法从GC Root开始通过引用链遍历出所有存活对象。清除阶段从内存中删除没有被标记也就是非存活对象。优点实现简短缺单碎片会问题。
复制算法的核心思想 准备两块空间From空间和同空间每次兑现分配阶段只能使用其中一块空间From 空间。
在垃圾回收GC阶段将From中存活的对象复制到To空间。将两块内存空间的From和To名字互换。优点 吞吐量高只需要遍历一次存活对象。不会发生碎片化。 缺点 内存使用率低。
标记整理算法 标记整理算法也叫标记压缩算法是对标记整理算法中容易产生内存碎片问题的一种解决方案。核心思想
标记阶段将所有存活对象进行标记采用可达性分析算法。整理阶段将存活对象移动到堆的一端。进行清理操作。优点 吞吐量高只需要遍历一次存活对象。不会发生碎片化。 缺点 整理阶段效率不高。
分代垃圾回收算法 将整个内存区域划分为年轻代存活时间比较短的对象和老年代存放时间比较长的对象。
在JDK8添加-XX:UseSerialGC参数使用分代回收的垃圾回收器运行程序。在arthas中使用memory命令查看内存显示出三个区域的内存情况。 分代回收时创建出来的对象首先会被放入Eden伊甸园区。随着对象在Eden区越来越多如果Eden区满新创建的对象已经无法放入就会触发年轻代的GC称为Minor GC或者Young GC。Minor GC会把需要eden中和From需要回收的对象回收把没有回收的对象放入To区。如果Minor GC后对象的年龄达到阈值最大15默认值和垃圾回收器有关对象就会被晋升至老年代。当老年代中空间不足无法放入新的对象时先尝试minor gc如果还是不足就会触发Full GCFull GC会对整个堆进行垃圾回收。
调整内存区域的大小 根据以下虚拟机参数调整堆的大小并观察结果。注意加上-XX:UseSerialGC