zoukankan      html  css  js  c++  java
  • JVM

    虚拟机、字节码、平台无关

    JVM内存分配

    栈内存分配:栈调优 -XSS

    堆内存变量:保存对象


    JVM堆配置参数:

    -Xms 初始堆大小 默认物理内存的1/64(<1GB)

    -Xmx 最大堆大小 默认物理内存的1/4(<1GB),实际中建议不大于4G

    一般建议设置 -Xms = -Xmx
    好处是避免每次在gc之后,调整堆的大小,减少系统内存分配开销

    整个堆大小=年轻代大小+年老代大小+持久代大小

    新生代=1个eden区+2个Survivor区

    -Xmn 年轻代大小

    -XX:NewRatio 年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)

    Xms=Xmx并且设置了Xmn的情况下,改参数不需要进行设置

    -XX:SurvivorRatio

    Eden区与Survivor区的大小比值,用来存放JVM刚分配的Java对象


    1、Java老年代=整个堆-年轻代大小-持久代大小

    2、年轻代中经过垃圾回收没有回收掉的对象被复制到老年代

    3、老年代存储对象比年轻代年龄大的多,而且不乏大对象

    4、新建的对象也有可能直接进入老年代(大对象、大的数组对象)可通过启动参数设置
    -XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大就不在新生代分配,而是直接在老年代分配。

    5、老年代大小无配置参数

    Java持久代

    1、持久代=整个队-年轻代大小-老年代大小

    2、-XX:PermSize -XX:MaxPermSize
    设置持久代的大小,一般情况下推荐把-XX:PermSize设置成XX:MaxPermSize的值为相同的值因为持久代大小的调整也会导致堆内存需要触发fgc

    3、存放Class、Method元信息

    jvm内存垃圾回收:

    jvm垃圾收集算法:

    1、引用计数算法(已过时)
    每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1
    计数为0时可以回收。方法简单,但是无法解决对象相互循环引用的问题,还
    有一个问题是如何解决精准计数。

    2、根搜索算法

    从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC
    Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

    jvm垃圾回收算法:

    1、复制算法(copying)对象少时比较高效,需要占用一块内存交换空间用于进行
    对象的移动。用于新生代的回收。

    2、标记清除算法(Mark-Sweep)不进行对象移动 会有内存碎片问题

    3、标记整理压缩算法(Mark-Compac)进行对象移动,成本高,消耗资源,没有内 存碎片问题



    1、串行回收
    gc单线程内存回收、会暂停所有用户线程

    2、并行回收
    收集是指多个GC线程并行工作,但此时用户线程是暂停的;所以,Serial是串行的,Parallel收集器是并行的,而CMS收集器是并发的

    3、并发回收
    是指用户线程与GC线程同时执行,不一定是并行,可能交替,但总体上是在同时执行,不需要停顿用户线程。

    Serial回收器 -XX:+UseSerialGC来开启


    新生代ParNew回收器:

    -XX:+UseParNewGC 新生代使用并行回收收集器,老年代使用串行收集器

    -XX:ParallelGCthreads 指定线程数

    新生代Parallel Scavenge回收器

    1、吞吐量优先回收器
    关注CPU吞吐量,即运行用户代码的时间/总时间,比如:JVM运行100分钟,其中运行用户代码99分钟,垃圾收集1分钟,则吞吐考量99%,这种收集器能最高效率的利用CPU,适合运行后台运算。


    2、-XX:+UseParallelGC 开启
    使用Parallel Scavenge + Serial Old收集器组合回收垃圾,这也是在Server模式下的默认值

    3、-XX:GCTimeRatio

    来设置用户执行时间占总时间的比例,默认99,即1%的时间用来进行垃圾回收

    4、-XX:MaxGCPauseMillis 设置GC的最大停顿时间

    5、使用复制算法


    老生代Parallel Old回收器:

    1、-XX:+UseParallelOldGC开启
    使用Parallel Scavenge +Parallel Old 组合收集器进行收集

    2、使用标记整理算法

    3、并行的、独占式的垃圾回收器

    CMS(并发标记清除)回收器:

    运行分为4各阶段:

    初始标记(CMS initial mark) 只标记GC Roots能直接关联到的对象

    并发标记(CMS concurrent mark)进行GC Roots Tracing的过程

    重新标记(CMS remark)修正并发标记期间因用户程序继续运行而导致标记发 生的那一部分对象的标记

    并发清除(CMS concurrent sweep)

    其中标记和重新标记连个阶段任然需要Stop-The-World,整个过程中耗时最长的并发标 记和并发清除过程中收集器都可以和用户线程一起工作

  • 相关阅读:
    .NET 2.0泛型集合类与.NET 1.1集合类的区别(二)
    关于插件的好文章
    MemberInfo.GetCustomAttributes和MemberDescriptor.Attributes获取特性的不同
    新一代编程语言
    .NET 2.0泛型集合类与.NET 1.1集合类的区别(一)
    发现一篇关于.NET 2.0中关于事务命名空间的好文章
    C# WinForm控件美化扩展系列之给TextBox加水印
    log4.net
    C# GDI+ 双缓冲
    C# WinForm控件美化扩展系列之ListBox
  • 原文地址:https://www.cnblogs.com/Template/p/9323296.html
Copyright © 2011-2022 走看看