JVM二、JVM运行机制二、常见JVM配置参数、
常见JVM配置参数
trace跟踪参数、堆的分配参数、栈的分配参数
gc前为4790k,gc后为374k,回收了4m左右,当前堆的总大小为16m左右。
PrintGCDetails是在程序结束后打印的堆详细内容。 【tenured genration 老年代】【conpacting perm gen 永久区】
-----------------------------------
重定向GC的log , 用来做一些开发的问题分析。
这个打印信息是非常详尽的, 主要对比前后的占用百分比变化。
--------------------------------------
监控系统中每个类的加载
--------------------------------------
解读:Byte数组有89万个实例 , 占用了470266000字节。这个命令查看程序中使用较多的类对象,可以用来预估outOfMemory造成的原因。
------------------------------------------------------------------------------
堆的分配参数
打印:
Xmx是最大的20m , free mem是当前空闲的堆空间比如4.3m , total mem是当前的总空间如启动设定的5m实际输出4.8m。
当最小堆空间不够的时候系统会扩大总内存,也就是total mem的值会变大比如9m。System.gc()执行gc。
问题:
-Xmx和-Xms保持什么样的关系能使系统性能尽可能的好?
java程序与jre绑定,给用户使用, 如何使jre尽可能的小?
新生代只有1m,很小byte数组生成有10m 。可以看到日志中10m全部在老年代,过程中没有触发gc。
----------------
没有触发gc,所有分配的对象空间都在内存里。
----------------
进行过两次gc,新生代1139k和老年代2508k还留在系统里。
----------------
调大幸存代的空间,使得其可以正常使用,就不用进入到老年代。 使得gc进行了三次回收分别回收了大概1m、3m、3m共7m,也可以看出生成10m的空间只有新生代中被使用了3m的堆内存空间,其余7m被gc了。
---------------
增大新生代的空间,可以看出幸存代也相应增大, 此时同样是回收了7m , 内存中剩余3m,但是此时只进行了2次gc。
---------------
幸存代占新生代的空间越小但不能小到利用不起来,就可以更合理的利用内存空间,同时减少gc的次数 。此时调小幸存代大小可以看到只gc了一次,内存使用7m不多也不少。
------------------------------------------------------------------------------
在系统宕掉之前将堆内存信息全部转存到文件中。用于事故发生后推测当前系统宕掉时到底发生了什么事情。
-----------------
宕掉后我们就可以在a.txt中看到线程的信息。这个脚本我们自己配置成邮件发送、报警、重启程序等等脚本。
-----------------
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
-----------------
每个线程都会创建一个栈空间,因此如果程序要尽可能多的使用线程的话就尽量减小每个栈空间。但是栈的大小决定了函数调用的深度, 所以如果栈空间太小而递归调用太深就会造成栈溢出。
这个没有出口的递归必然会导致栈溢出,右侧是不同大小的栈空间和函数执行的深度。