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:设置幸存区的目标使用率

posted on 2020-02-27 22:16  pipizhou  阅读(211)  评论(0编辑  收藏  举报