美文网首页
JVM学习摘录

JVM学习摘录

作者: 大黑跟小白的日常 | 来源:发表于2019-02-21 23:16 被阅读12次

    JVM简单介绍

    堆栈

    1、栈解决程序的运行问题,即程序如何执行,或者说如何处理数据

    2、堆解决的是数据存储的问题,即数据怎么放、放在哪儿

    3、堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用;

    4、Java中一个线程就会相应有一个线程栈与之对应;

    5、堆则是所有线程共享的;

    6、在栈中,一个对象只对应了一个4btye的引用;

    7、Java程序在运行时,永远都是在栈中进行的,因而参数传递时,只存在传递基本类型对象引用的问题,不会直接传对象本身

    8、因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能;

    9、堆中对象不再被栈中任何引用指向,则堆中这个对象成为垃圾回收目标;

    10、Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点;

    对象大小

    1、一个空Object对象的大小是8byte;Object ob = new Object()

    2、它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte

    3、有了Object对象的大小,我们就可以计算其他对象的大小了。

    其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。

    引用类型

    1、强引用(一直拥有引用指向的指针):就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收

    2、软引用:作为缓存来使用,若堆内存富余,不会被回收;

    3、弱引用:作为缓存来使用,不会立即被回收,一个GC生命周期之后,肯定被回收;

    分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。

    如果在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。

    虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation);

    持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的;

    持久代:

        用于存放静态文件,如今Java类、方法等。

    有些应用可能动态生成或者调用一些class,例如Hibernate等。这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置

    Full GC

    对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。

    有如下原因可能导致Full GC:

    · 年老代(Tenured)被写满

    · 持久代(Perm)被写满

    · System.gc()被显示调用

    ·上一次GC之后Heap的各域分配策略动态变化

    串行垃圾收集(单核处理器)

    此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。可以使用-XX:+UseSerialGC打开。

    并行垃圾收集器(多核处理器)

    年轻代进行并行垃圾回收,因此可以减少垃圾回收时间。一般在多线程多处理器机器上使用。使用-XX:+UseParallelGC.打开;

    如果年老代不使用并发收集的话,默认是使用单线程进行垃圾回收,因此会制约扩展能力。使用-XX:+UseParallelOldGC打开;

    -XX:ParallelGCThreads=设置并行垃圾回收的线程数。此值可以设置与机器处理器数量相等;

    最大垃圾回收暂停:指定垃圾回收时的最长暂停时间,通过-XX:MaxGCPauseMillis=<N>指定。><N>为毫秒.如果指定了此值的话,堆大小和垃圾回收相关参数会进行调整以达到指定值。设定此值可能会减少应用的吞吐量。

    吞吐量:为垃圾回收时间非垃圾回收时间的比值,通过-XX:GCTimeRatio=<N>来设定,公式为1/(1+N)。例如,-XX:GCTimeRatio=19时,表示5%的时间用于垃圾回收。默认情况为99,即>1%的时间用于垃圾回收。

    并发垃圾收集器

    可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中、大规模应用使用-XX:+UseConcMarkSweepGC打开

    并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对象。

    小结

    串行处理器:

    适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。

    缺点:只能用于小型应用

    并行处理器:

    适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。

    缺点:垃圾收集过程中应用响应时间可能加长

    并发处理器:

    适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。

    典型设置

    java -Xmx3550m -Xms3550m -Xmn2g –Xss128k

    -Xmx3550m:设置JVM最大可用内存为3550M。

    -Xms3550m:设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

    -Xmn2g:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

    -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

    java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

    -XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

    -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

    -XX:MaxPermSize=16m:设置持久代大小为16m。

    -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

    JDK5.0以后,JVM会根据当前系统配置进行判断。

    吞吐量优先的并行收集器

    如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。

    响应时间优先的并发收集器

    如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。

    详细见

    https://www.cnblogs.com/andy-zhou/p/5327288.html

    相关文章

      网友评论

          本文标题:JVM学习摘录

          本文链接:https://www.haomeiwen.com/subject/mckjyqtx.html