1) stack栈内存:用于运行线程,包括了方法里的临时数据,存放的是线程运行的局部变量,还有对象的引用
1, Java虚拟机的内存结构
1) heap 堆内存:对象的实例
2) non heap 非堆内存:方法区域:运行时常量值和静态方法。
例如:person p = new person();
P 这变量是对象的引用存在stack中, new person()是一个对象的实例,存在堆中。
2, java 的内存模型:heap 和 perm(永久代) 。
1)heap :eden 新生代 (minor gc 新生代的垃圾回收) + old memory 年老代(major gc 年老代的垃圾回收器)。
2)heap : -xms 最小值 , -xmx 最大值。-xmn年轻代的大小
3)perm:-xx:permsize 最小值, -xx:maxpermsize 最大值。
3, 年轻代:新创建的对象都在年轻代中。
特点:minor gc 执行速度很快,基本看不出应用线程停止。
4, 年老代:当一个对象被minor gc 多次垃圾回收的时候,都没有收集回去的时候,这个对象就会被转移到年老代。
Major gc:年老代内存被占满时开始执行垃圾回收,major gc 会花费很长时间,并且在执行的时候应用线程会全部停止(stop the world)。
由于major gc 会检查所有存活对象,因此会花费更长时间,应该经量减少major gc 的执行,因为在major gc 垃圾回收期间让你的应用反应迟钝,所以如果你有一个需要快速响应的应用发送多次major gc 时,可能会出超时错误。
5, 垃圾回收时间取决于垃圾回收策略。这就是为什么需要监控和调优垃圾回收,从而避免jvm执行major gc 。
6, 永久代:包含了java需要的应用元数据,永久代不是java堆内存的一部分。包含了java se 库的类和方法。 存放了jvm运行时使用的类 。
永久代没有自动垃圾回收机制, 但是执行Full GC 的时候也会对永久代进行垃圾回收。 例如,jar 包。
7, jvm的性能调优:
set java_opts=-xms=1024M –XMX=1024…..
-XMS: 在生产环境中,-xms 和-xmx 最好是设置成一样大,这样的好处是可以减少minor gc 的频率。
-XMX:
-XMN:新生代大小一般是-xms的百分之三四十。
-XX:Permsize:基本是看项目的大小,项目中的jar包特别多,tomcat中运行多个jar项目,这个时候需要调大这个值。 因为在服务启动的时候,会把所有class类都加载进来。
-xx:maxpermsize
8, minor gc , major gc , full gc 的区别?
minor gc :当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了。所以分配率越高,越频繁执行 Minor GC。同时执行minor gc 的时候也是所有应用都暂停,但是执行minor gc 的时候一般都很短,几乎忽略不计。
major gc:老年代内存满时,清理老年代内存空间, 执行时间很长,影响性能,所以经量减少执行major gc 的操作。
full gc :清理了整个内存空间,包括了年轻代和年老代。 程序里调用system.gc的时候也会触发full gc 。
有时候也说minor gc 会触发major gc , 所有我们不用去关心到底是叫 Major GC 还是 Full GC,大家应该关注当前的 GC 是否停止了所有应用程序的线程,还是能够并发的处理而不用停掉应用程序的线程。
9,总结:
java垃圾回收调优应该是提升应用吞吐量的最后一个选择,在你发现应用由于长时间垃圾回收导致了应用性能下降,出现超时的时候,应该考虑java垃圾收集调优。
出现java.lang.outofmemoryerror:permgen space 错误的时候,需要jvm监控permgen 空间,并情况调整大小。
出现OutOfMemoryError: Java heap space 堆溢出错误的时候,需要调整 -xmx ,-xmn 年轻代和堆总大值。
如果你看到了大量的full gc 操作的时候,需要考虑调整老年代的内存空间。
全面垃圾回收调优需要花费大量的努力和时间,这里没有一尘不变的硬性规则,需要不断的尝试。
如果应用对响应有更高的要求,停顿最好小于一秒,也就是执行minor gc 和 full gc 的时间要小于1s ,这样就要不断的调整参数。
10,
root@ubuntu:/# jstat -gc 21711 250 4 监控gc:
j现在来解释各列含义:
1 S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
2 EC、EU:Eden区容量和使用量
3 OC、OU:年老代容量和使用量
4 PC、PU:永久代容量和使用量
5 YGC、YGT:年轻代GC次数和GC耗时
6 FGC、FGCT:Full GC次数和Full GC耗时
7 GCT:GC总耗时
11,jvm 的gc 机制调优:
https://www.cnblogs.com/onmyway20xx/p/6626567.html
12,jvisualvm :监控gc 的实例: