zoukankan      html  css  js  c++  java
  • jvm-内存模型和一些eclipse调优参数

    运行时数据区是一个逻辑视图,需要物理的实现,由JVM内存模型实现

    内存模型


    方法区和堆

      堆里面存储的是java对象,又因为大多数对象生命周期比较短 ,所以把短的放到Yong区 长的放old区 提高gc的效率

    Eden区 和 S区

      所有声明周期比较短的对象中 如果只有一个young区 1,2,3,4,5--->直接进入到old区,又不希望old区对象很多,因为old区对象多了,就可能空间变小,变小就会触发old的gc操作,消耗的时间比较长

      新的对象创建直接在eden中创建,除非yuong区内存不够了会存在old区 也叫作内存空间担保

      young区进行一次gc  gc完成之后 有用的对象进行到survive区

    为什么s区分S0和S1呢?

      不区分的话会造成空间的不连续性(因为当s区空间不够的话会直接到old区 造成空间不连续性)
    S0和S1相同大小的空间,保证每次分配的空间是连续的,相对来说有空间的浪费

      Eden:S0:S1 为 8:1:1的空间比例

    Old区会执行full gc     Eden区执行的是Minor gc 

    当申请内存空间的时候会访问Eden区看是否有足够空间,true直接申请成功,false 会执行Minor gc操作JVM回收不活跃的对象

    清理后会继续访问eden区是否有足够空间,有空间的话在Eden区新对象空间申请成功,

    如果Eden区gc后还是没有空间的话会访问Survive区是否有足够空间,S区有空间会把Eden区的部分活跃对象复制到S区,在Eden申请到新对象空间。S区没空间的话

    又会查看old区是否有空间,old区有空间的话会把s区的部分活跃对象复制到old区,再把Eden区的部分活跃对象复制到S区,然后在Eden区申请新对象的空间,

    如果old区也没有空间的话会执行 Full GC操作 JVM回收对象  gc完之后会继续访问old的是否有足够空间,如果还是没有足够空间 直接报错 OutofMemoryError

    如果有空间的话会把S区的部分活跃对象复制到Old区  把Eden区的部分活跃对象复制到S区 再在Eden区申请到新对象的空间

    tomcat调节jvm初始内存大小

    windows下tomcat的运行文件为catalina.bat,打开文件,在文件中部找到“rem ----- Execute The Requested Command -----”字样 ,在它后面添加如下内容即可

     
    set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"
     
    rem ----- Execute The Requested Command ---------------------------------------
    set JAVA_OPTS=%JAVA_OPTS% -server -Xms2048m -Xmx2048m -Xmn512m -XX:PermSize=400m -XX:MaxPermSize=700m
    echo Using CATALINA_BASE:   "%CATALINA_BASE%"
    echo Using CATALINA_HOME2:   "%CATALINA_HOME2%"
    echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"if ""%1"" == ""debug"" goto use_jdk
    echo Using JRE_HOME:        "%JRE_HOME%"goto java_dir_displayed
    :use_jdk
    echo Using JAVA_HOME:       "%JAVA_HOME%"
    :java_dir_displayed
    echo Using CLASSPATH:       "%CLASSPATH%"
     

    Eclipse调优:

    更改eclipse.ini

    做如下更改

    当虚拟机进行垃圾回收时会输出GC日志到gc.log,可以将输出的gc.log上传到GC日志在线解析工具https://gceasy.io/进行解析。

    常见 JVM 参数说明

    堆区:
    -Xms  初始堆大小,默认是物理内存的1/64,
    -Xmx  最大堆大小,物理内存的1/4,
    空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
    因此服务器一般设置-Xms、-Xmx 相等,生产环境建议设为1024m以上
    -Xmn  年轻代大小

    -XX:NewSize   设置年轻代大小
    -XX:MaxNewSize  年轻代最大值

    非堆区:
    -XX:PermSize   设置持久代(perm gen)初始值(非堆内存初始值),物理内存的1/64
    -XX:MaxPermSize   设置持久代最大值(最大非堆内存),物理内存的1/4

    与垃圾回收相关的JVM参数:

    -XX:-DisableExplicitGC — 让System.gc()不产生任何作用

    -XX:+PrintGCDetails — 打印GC的细节

    -XX:+PrintGCDateStamps — 打印GC操作的时间戳

    -XX:NewRatio — 可以设置老生代和新生代的比例

    -XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布

    -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值

    -XX:TargetSurvivorRatio:设置幸存区的目标使用率

  • 相关阅读:
    CentOS7下安装Scrapy
    阿里云ECS提示RHSA-2017:3263: curl security update
    CentOS 7.0安装配置LAMP服务器(Apache+PHP+MariaDB)
    Electron: 从零开始写一个记事本app
    flask请求流程
    编写Dockerfile
    docker-compose使用
    redis持久化切换rdb到aof
    RESTful API规范
    介绍importlib
  • 原文地址:https://www.cnblogs.com/lanqingzhou/p/12374882.html
Copyright © 2011-2022 走看看