zoukankan      html  css  js  c++  java
  • jvm

    jvm基础:

    https://www.cnblogs.com/clamp7724/p/11750764.html

    调优这方面- -其实除了架构师基本用不到,知道基本原理和简单的调优就可以了。。。

    调优一般是调优 方法区 和 堆

    方法区: 存放方法的信息(变量,常量,类信息,运行时常量池等)

    堆(GC发生在这里): 存放对象实例

    1.堆

    1.1 新生代区

    1.1.1 伊甸区 (西方神话人类起源地-。-)

    1.1.2 survivor from (幸存者from区)

    1.1.3 survivor to (幸存者to区)

    1.2 老年代区

    内存比例:

    新生代:老年代 = 1 : 2

    伊甸区:survivor from :survivor to = 8:1:1  

    GC机制: (survivor from 和 survivor to 直接写成from 和 to)

    1. 一个对象实例A被声明后进入堆的新生代伊甸区

    2. 根据GC策略(比如GC发现没有指向A的变量了,或者伊甸区满了等),A进入from区

    3. from满了以后,触发Miner GC(轻GC),把from区的一部分幸存者数据放到 to区,2区互换(A还是在from区,只不过是之前的to区),清的to区(之前的老from区,没被复制到to区的都被清空了= =)。新来的开始进入新from区。

    4. 新from区满了以后,重复以上步骤,15次(jvm默认次数)后, A还活着的话就会进入老年区。

    6.当老年代区也满了以后,会产生full GC, jvm会停掉所有线程(STW: stop the world),开始全面清理垃圾。

    如果A的占用空间非常大,为了防止过度频繁的轻GC(幸存者区会很快满。。。),会直接把A放到老年区。

    GC的调优主要就是改变这几个区域的空间大小比例,还有垃圾回收算法(GC策略),减少full GC

    垃圾回收算法:

    1. 标记清除算法:

    把可回收的部分标记为清除(逻辑清除),假装不存在了,以后需要空间可以直接覆盖。

    缺点: 幸存者的内存地址不连续,会有很多碎片。可能会导致大对象存不进来直接GC

    2. 复制算法:(survivor from 和 to 的常用算法就是这个)

    只用内存的1/2,1区和2区,每次内存回收的时候,1区把不需要清除的复制到2区,此时对象在2区内存地址连续,没有碎片,然后清空1区,把2区作为新的1区。

    缺点:少了一半可用空间。

    3. 标记整理算法:

    先把幸存对象和可回收的对象标记,然后把可回收的清除,重新整理排序。

    缺点:开销大,花费时间长。 

    4.分代收集算法:(现在大部分都用的这个)

    不同区域不同算法。

    新生代中大量对象死去(局部变量这类的),所以用复制算法。

    老年代中的对象都是在幸存者区域中经过了15次的GC回收的老不死- -所以高概率长久存活,因此用标记整理或者标记清除算法。

  • 相关阅读:
    学习进度03
    构建之法阅读笔记03
    软件工程结队作业01
    用图像算法增强夜视效果
    python将指定目录下的所有文件夹用随机数重命名
    python脚本中调用其他脚本
    opencv+python实现图像锐化
    机器学习中减弱不同图像数据色调及颜色深浅差异
    python利用列表文件遍历
    python文件处理-检查文件名/路径是否正确
  • 原文地址:https://www.cnblogs.com/clamp7724/p/11828988.html
Copyright © 2011-2022 走看看