郑州网站建设网络公司,管理咨询公司一般是做什么的,网站平台内容建设提纲,如何对网站页面进行优化程序的栈和堆
栈先进后出#xff0c;且里面的数据自动释放#xff0c; 堆内的空间则需要手动释放
java python go
只管创建#xff0c;不用像c,c需要手动释放空间#xff0c; 因为他们都会开一个进程GC#xff08;Garbage Collector#xff09;#xff0c;由垃圾回收…程序的栈和堆
栈先进后出且里面的数据自动释放 堆内的空间则需要手动释放
java python go
只管创建不用像c,c需要手动释放空间 因为他们都会开一个进程GCGarbage Collector由垃圾回收器来复制回收
如何分辨什么是垃圾如何定位垃圾
Java使用的方法是RootSearching,例如main方法的根开始往下走只要能通的空间就不是垃圾走不通的且存在的空间都是垃圾
常用的垃圾回收算法和垃圾回收器
三种垃圾回收算法
Mark-Sweep(标记清除)
原来是垃圾的部分标记可用清掉垃圾则该部分就可以等待使用了但容易碎片化
Copying(拷贝)
就把与根相关的空间存储到另一片区域然后这部分区域全部清除但太浪费内存了
Mark-Compact标记压缩
把与根相关的空间按序排好其余清掉效率最低
三种算法的综合运用产生了各式各样的垃圾回收器
GC 前6种垃圾回收期应用堆内存分为两代的情况后四种堆内存分为多块
随着内存大小的不断增长而演进
GC方式一堆内存逻辑分区分代青年代老年代 进程一创建先放入eden然后进行第一次垃圾清除如果没有清除则转入survivor再一次清除则又放入第二个survivor两个survivor来回存放和清除且记录次数当到达某个次数则可以进入老年代老年代中的空间不会每次都进行垃圾清除。 新生代大量死去少量存活采用赋值算法 老年代存活率高回收较少采用MC或MS
垃圾回收器Serial and Serial OldGC(内存只有几兆-几十兆)
STW规则当要进行垃圾清除时所有进程停止活动直到垃圾清除完毕 且Serial应用在新生代 和 Serial Old采用mark-sweep-compact i也是垃圾回收器应用在老年代 都是单垃圾回收进程
垃圾回收器Parallel Scavenge and Parallel OldGC(并行多线程)几十兆-上百兆
Parallel Scavenge在新生代 Parallel Old 在老年代 多个线程同时处理垃圾 jdk1.8默认垃圾回收器就是这两个简称ps po
垃圾回收器Concurrent GC
这种情况 GC线程和业务线程可以同时执行 CMS 、ParNew、G1、ZGC、Shenandoah都熟悉Concurrent
CMS
CMS工作在老年代可以与初生代中的Serial和ParNew搭配使用 常常CMS 与 ParNew工作在年轻的多线程垃圾回收器是增强的Parallel Scavenge就是为了配合CMS使用
三色标记算法 第一轮垃圾扫描如果当前节点扫描后且孩子节点也扫描则标记为黑色如果只扫描了当前节点没有扫描它的孩子节点则标记为灰色如果当前节点没扫描过则标记为白色。
CMS方案Incremental Update黑色节点下次垃圾回收线程再扫描时就不会再扫描了当黑色节点又指向新节点时需从黑色改为灰色这样才能扫描到白色新节点。
Epsilon jdk11产生
什么都不做只是做内存记录帮助程序员debug用
G1摈弃年轻代和老年代改为分区算法
物理不分为两个大代分为多个区但在逻辑上存储依然是年轻代和老年代每个小分区所处的逻辑位置不是固定的当某个小区域满时则GC扫描该小区域把不是垃圾复制到另外一个小区域清除该小区域。
G1方案SATB也是三色标记但与CMS不同当第一次扫描后由于白色没扫到可能会被当成垃圾所有把灰色与白色之间的引用做一个记录放入到GC的堆栈则下次再扫描时会看看记录表这样就不会把区域当成垃圾了
整个区域会有一片区域作为RSET记录有效的引用
ZGC
颜色指针 分页不分老年代和年轻代所有分区都一样快要满的分区则清除