获取地址栏上的URL参数现在最简单通用的方法应该就是下面这种了。 function getUrlParam (name) {var reg = new RegExp('(^|&)' + name +
顺晟科技
2021-06-16 10:42:13
256
有两种类型的垃圾收集:清除垃圾收集和完全垃圾收集
1、清除气相色谱
通常,当生成一个新对象并且在伊甸园中的空间应用失败时,将触发清除垃圾收集,垃圾收集将在堆的伊甸园区域执行,非幸存对象将被清除,幸存对象将被移动到幸存者的两个区域。
2、全气相色谱
整理整个堆,包括Young,stretched,Perm。完全垃圾收集比清除垃圾收集慢,因此应该尽可能减少完全垃圾收集,这可能是由以下原因造成的
一、绷满;
B.Perm字段已满
显示并调用System.gc()
d、最后一次GC后,Heap的各个域分配策略动态变化;
-xmx 512m-xms 512m-xmn 192m-XSS 128k
JVM中的更大堆大小受三个方面的限制:相关操作系统的数据模型(32位或64位);系统的可用虚拟内存限制;系统的可用物理内存限制
-Xmx512m:
将JVM实例堆的更大可用内存设置为512M。
-Xms512m:
设置JVM使内存512m。该值可以设置为与-Xmx相同,以避免每次垃圾收集后JVM重新分配内存。
-Xmn192m
将年轻一代的大小设置为192米。整个JVM内存大小=年轻一代大小老一代大小持久一代大小。一般一代都是64m的固定尺寸,所以增加年轻一代会减少老一代的尺寸。这个值对系统性能影响很大,Sun官方推荐配置为全堆的3/8。
-Xss128k
为每个线程设置堆栈大小。JDK5.0以后,每个线程的栈大小是1M,之前每个线程的栈大小是256K。调整更多应用线程所需的内存大小。在相同的物理内存下,降低这个值可以产生更多的线程。但是操作系统对一个进程的线程数是有限制的,不能无限生成,经验值在3000~5000左右。
请注意以下问题:
(1)虽然增加Heap的大小会降低GC的频率,但也会增加每次GC的时间。并且在GC运行的时候,所有的用户线程都会被挂起,也就是说在GC期间,Java应用什么都不会做。
(2)堆的大小不决定进程的内存使用。进程的内存使用量大于-Xmx定义的值,因为Java为其他任务分配内存,比如每个线程的堆栈。
(3)服务器端的JVM应该将-Xms和-Xmx设置为相同的值。为了优化GC,更好使-Xmn的值约等于-Xmx的1/3(也指出是3/8)。
(4)一个应用更好每10到20秒运行一次GC,每次在半秒内完成。
Java-Xx : newratio=4-Xx 3360 survivorratio=4-Xx : max permsize=16m-Xx : max teneringthreshold=0-Xx : newratio=4
设置年轻一代(包括伊甸园和两个幸存者区域)与老一代(不包括持续一代)的比例。设置为4时,年轻一代与年长一代的比例为1: 4,年轻一代占整个堆栈的1/5
-xx: urvivorratio=4
设定年轻一代伊甸园面积与幸存者面积的比例。当设置为4时,两个幸存者区域与一个伊甸园区域的比例为2:4,一个幸存者区域占整个年轻一代的1/6
-XX:PermSize=128M
将持久代大小设置为128米
-XX:MaxPermSize=16m
将更大世代设置为16m。
MaxPermSize太小,导致:java.lang.out内存错误: perm gen空间
-xx: maxteningthreshold=0
设置垃圾的更大年龄。如果设置为0,年轻一代将直接进入年长一代,而不经过幸存者区域。可以提高老一代更多应用的效率。如果将此值设置为较大的值,年轻一代对象将在幸存者区域被多次复制,这可以增加对象在年轻一代中的生存时间,并增加在年轻一代中被回收的引入。
JVM提供了三种选择:
串行收集器
使用单线程处理所有垃圾收集工作效率更高,因为它不需要多线程交互,但是它不能利用多处理器,所以这个收集器使用单处理器机器。当然,这个收集器也可以用在数据量小(100M)的多处理器机器上,可以用-xx: useserialcgc打开
应用:数据量相对较小(约1亿);单处理器下的应用,不需要相应的时间
缺点:只能用于小型应用
平行收集器
对年轻一代进行并行垃圾收集,可以减少垃圾收集时间,一般用在多线程处理机上。在Java SE6.0中增强,老一代可以并行收集。如果老一代不使用并发收集,它将使用单线程进行垃圾收集,这将限制可伸缩性和使用
-XX:用户并行打开
-XX:ParallelGCThreads=N,设置并行垃圾收集的线程数,可以设置为与机器处理器数一致;
用途:“高吞吐量要求”,多CPU、大中型应用,无应用时间要求。如背景处理、科学计算等
缺点:对应的申请时间可能更长;
并行收集器
它可以保证大部分工作并发进行(应用不停止),垃圾收集只暂停很短时间。该采集器适用于相应时间要求较高的大中型应用。
用-xx: usecamrkswepgc打开
适用性:“对响应时间要求高”,对应用响应时间要求高的多CPU、中、大型应用。如:Web服务器/应用服务器、电信交换机、集成开发环境
但是串行采集器只适合小数据,所以这里选择的主要是并行采集器和并发采集器。
默认情况下,JDK5.0之前使用的是串行采集器。如果要使用其他采集器,需要在启动时添加相应的参数。JDK5.0之后,JVM会根据当前的系统配置进行判断。
吞吐量并行收集器
如上所述,并行采集器主要是为了达到一定的吞吐量,适合科技和后台处理。
典型配置:
Java-xmx 3800m-xms 3800m-xmn 192m-XSS 128k-Xx : UseParallelGC-Xx : parallelgcthreads=20
-XX: UseParallelGC
选择垃圾收集器作为并行收集器。这种配置只对年轻一代有效。即在上述配置下,晚辈使用并发采集,老一辈仍然使用串行采集。
-XX:ParallelGCThreads=20
配置并行收集器的线程数,即同时垃圾收集在一起的线程数。该值优选地被配置为等于处理器的数量。
Java-xmx 512m-xms 512m-xmn 192m-XSS 128k-XX : UseParallelGC-XX : parallelgcthreads=20-XX : useparallellodgc
-XX : useparallellodgc
将旧的垃圾收集方法配置为并行收集。JDK6.0支持老一代的并行收集。
Java-xmx 512m-xms 512m-xmn 192m-XSS 128k-XX : UseParallelGC-XX : max gcpausemillis=100
-XX:MaxGCPauseMillis=100
设定每个年轻一代垃圾收集的更大时间。如果这个时间不能满足,JVM会自动调整年轻一代的大小来满足这个值。
如果指定了此值,堆大小和垃圾收集相关参数将被调整到指定值。辞职可能会降低应用程序吞吐量。
Java-xmx 512m-xms 512m-xmn 192m-XSS 128k-Xx : UseParallelGC-Xx : max gcpausemills=100-Xx : usedaptivesize policy
-XX:使用自适应大小策略
设置此选项时,并行采集器会自动选择年轻一代区域的大小和Survivor区域的对应比例,以达到目标系统指定的最小对应时间或采集频率。当使用并行收集器时,建议始终打开该值。
-XX:GCTimeRatio=n:
将垃圾收集时间设置为程序运行时间的百分比。公式为1/(1 n)吞吐量,即垃圾收集时间与非垃圾收集时间之比。
-XX:GCTimeRatio=19,表示5%的时间用于垃圾收集,默认值为99,即1%的时间用于垃圾收集。
具有响应时间优先级的并行收集器
如上所述,并发收集器主要是为了保证系统的响应时间,减少垃圾收集时的暂停时间。适用于应用服务器、电信领域等。
典型配置:
Java-xmx 512m-xms 512m-xmn 192m-XSS 128k-Xx : parallelgcthreads=20-Xx : useConcMarksweepgc-Xx : useParNewgc
-XX : useConcMarkswepgc
为老一代设置并发收集。在测试中对此进行配置后,由于未知原因,-XX:NewRatio=4的配置失败。所以更好用-Xmn来设置后辈的大小。
-XX: UseParNewGC
设置年轻一代并行采集。可以配合CMS收藏使用。JDK5.0以上,JVM会根据系统配置自行设置,不需要设置这个值。
Java-xmx 512m-xms 512m-xmn 192m-XSS 128k-XX : useConcMarksweepgc-XX : cmsfolgcsbeforCompression=5-XX : usecmsfocamplatfulcollection
-Xx : CmsfullgsbeForCompression
由于并发收集器不压缩和安排内存空间,运行一段时间后会产生“碎片”,降低运行效率。该值设置运行垃圾收集以压缩和整理内存空间的次数。
-XX : useCsmacompatfullCollection
为老一辈开启压缩。性能可能会受到影响,但碎片可以消除
信息
JVM提供大量命令行参数,并打印调试信息。主要有以下几种:
-XX: PrintGC
输出形式:[gc118250k-113543k (130112k),0.0094143secs
[完整GC 121376K-10414K(130112K),0.0650971秒]
-XX:打印详细信息
输出形式:[GC[def new : 8614k-781k(9088k),0.0123035 sec]118250k-113543k(130112k),0.0124633secs
[GC[defnew : 8614K-8614K(9088K),0.0000665秒][tenured : 112761K-10414K(121024K),0.0433488秒] 121376K-10414K(130112K),0.0436268秒]
-xx: print gctimestamps-xx: print GC:print gctimestamps可以与上述两者混合使用
输出形式:11.851:[GC 98328k-93620k(130112k),0.0082960secs
-xx: pringcapplication concurrent time :打印程序在每次垃圾收集之前的不间断执行时间。可以和上面混在一起
输出形式:申请时间3521524秒。
-xx: pringcapplicationtopedtime:程序在打印垃圾收集期间暂停的时间。可以和上面混在一起
输出格式:应用程序线程停止的总时间: 0.048229秒
-xx: printheapatgc :打印gc前后的详细堆栈信息
通用配置摘要
堆设置
-Xms:初始堆大小
-Xmx:更大堆大小
- XX:NewSize=n:年轻一代尺寸
-XX:NewRatio=n:设置年轻一代和老一代的比例。比如:是3,也就是年轻一代和老一代的比例是1: 3,年轻一代占整个年轻一代和老一代之和的1/4
-XX:SurvivorRatio=n:年轻一代中伊甸园区域与两个幸存者区域的比率。请注意,有两个幸存者区域。比如3表示伊甸园:幸存者=3: 2,一个幸存者面积占整个年轻一代的1/5
-XX:MaxPermSize=n:设置持久生成大小
收集器设置
-XX : useSerialig :设置串行采集器
-XX: UseParallelGC:设置并行收集器
-xx: use paralleldgldgc : set parallel old generation收集器
-xx: useconfmarkswepc :设置并发收集器
垃圾收集统计
-XX: PrintGC
-XX:打印详细信息
-XX:打印时间戳
-xloggc :文件名
并行收集器设置
-xx: parallelgcthreads=n :设置收集时并行收集器使用的CPU数量。并行收集线程的数量。
-xx: maxgcpausemalis=n :设置并行收集的更大暂停时间
-xx: gcttimetallio=n :设置垃圾收集时间占程序运行时间的百分比。公式为1/(1 n)
并发收集器设置
-xx: cm sincrementalmode :设置为增量模式。适用于单CPU。
-xx: parallelgcthreads=n :设置年轻一代并发采集器采集方式为并行采集时使用的CPU数量。并行收集线程的数量。
JVM调优工具Jconsole、jProfile、VisualVM
Jconsole :JDK自带简单的功能,但是在系统有一定负载的情况下可以使用。详细跟踪垃圾收集算法。
JProfiler:商业软件,需要付费。功能强大。
VisualVM:JDK自带强大的功能,类似于JProfiler。推荐
一个
2
三
内存泄漏检查
内存泄漏是常见问题,解决方法也是常见的,这里可以重点介绍一下,具体分析线程和热点的问题。内存泄漏一般可以理解为系统资源(各种资源、堆、栈、线程等)。)被错误使用,导致新的资源分配请求失败和系统错误。内存泄漏对系统有害,因为它会直接导致系统崩溃。需要区分,内存泄漏和系统过载是有区别的,虽然最后的结果可能是一样的。内存泄漏是由于未能回收已使用的资源而导致的错误,而系统过载是系统没有那么多资源可分配(其他资源正在被使用)。
优化摘要
为年轻一代选择尺寸
响应时间优先级的应用:
尽可能大的设置,直到接近系统的最小响应时限(根据实际情况选择)。在这种情况下,年轻一代的收藏频率也是最小的。同时,到达老一代的对象数量减少。
吞吐量优先的应用:
设置尽可能大,可能达到Gbit的水平。由于对响应时间没有要求,垃圾收集可以并行进行,一般适用于8CPU以上的应用。
老一代尺寸选择
响应时间优先级的应用:
老一代使用并发收集器,所以应该仔细设置它的大小,一般应该考虑并发会话率和会话持续时间等参数。如果堆设置小,会造成内存碎片,回收频率高,应用暂停,所以采用传统的清除标记的方法;如果堆很大,收集起来需要很长时间。优化方案一般需要参考以下数据获得:
并发垃圾收集信息
持久生成中并发集合的数量
传统气相色谱信息
年轻一代和年长一代在回收上花费的时间比例
减少年轻一代和年长一代花费的时间通常会提高应用程序的效率
吞吐量优先级应用程序:
一般来说,吞吐量优先的应用程序有较年轻的一代和较小的老一辈。原因是大部分短期对象可以尽量回收,中期对象可以减少,老一代可以存放长期存活的对象。
较小的桩导致的碎裂问题
因为老一代的并发收集器使用标记和清除算法,所以堆不会被压缩。当收集器回收时,它会合并相邻的空间,以便将它们分配给更大的对象。但是当堆空间较小时,运行一段时间后会出现“碎片化”。如果并发收集器找不到足够的空间,并发收集器就会停止,然后使用传统的标记和清除方法进行回收。如果出现“碎片”,可能需要以下配置:
-xx: usecompact full collection:使用并发收集器时,打开旧版本的压缩。
-xx: cmsfolgcsbeforecompression=0:打开上述配置时,这里设置了多少次Full GC,然后压缩老一代
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2019-08