Selepas dua tahun, saya telah menyemak lebih daripada 100 resume dan menjalankan lebih daripada 200 temuduga palsu.
Baru minggu lepas, seorang rakan sekelas ditanya soalan ini semasa temu bual teknikal dengan Alibaba Cloud: Anggap platform dengan 1 juta permintaan log masuk setiap hari dan nod perkhidmatan dengan memori 8G Apakah yang perlu kita lakukan? Tetapkan parameter JVM? Jika anda rasa jawapannya tidak sesuai, datang dan tanya saya untuk semakan.
Jika anda juga memerlukan pengubahsuaian resume, kecantikan resume, pembungkusan resume, temuduga olok-olok dan lain-lain, anda boleh menghubungi saya.
Perkara berikut disusun untuk anda dalam bentuk soalan temuduga, untuk membunuh dua burung dengan satu batu:
Semua orang perlu belajar, kecuali skema konfigurasi JVM Selain itu, ia adalah cara menganalisis masalah dan perspektif pemikiran tentang masalah. Idea dan perspektif ini boleh membantu semua orang pergi lebih jauh dan lebih jauh.
Seterusnya, mari kita ke intinya.
Cara untuk menetapkan parameter JVM untuk 1 juta permintaan log masuk setiap hari dan memori 8G boleh dibahagikan secara kasar kepada 8 langkah berikut.
1. Ringkasan rutin
Sebarang sistem perniagaan baharu perlu menganggar konfigurasi pelayan dan parameter memori JVM sebelum pergi ke dalam talian ini bukan hanya anggaran rawak oleh arkitek sistem berdasarkan Anggarkan senario perniagaan di mana sistem berada, membuat kesimpulan model operasi sistem dan menilai penunjuk seperti prestasi JVM dan kekerapan GC. Berikut ialah langkah pemodelan yang saya rumuskan berdasarkan pengalaman pakar dan amalan saya sendiri:
2. tidak tahu bagaimana untuk melakukannya!
Cuma bercakap tanpa mengamalkan helah, ambil sistem log masuk sebagai contoh untuk mensimulasikan proses pemotongan:Jadi, secara kasar boleh disimpulkan bahawa sistem log masuk dengan 1 juta permintaan setiap hari, mengikut konfigurasi kluster 3-contoh 4C8G, memperuntukkan memori timbunan 4G dan JVM generasi baharu 2G boleh memastikan beban normal sistem .
Pada asasnya menilai sumber sistem baharu, jadi berapa banyak kapasiti dan konfigurasi yang diperlukan oleh setiap tika untuk membina sistem baharu, berapa banyak kejadian yang dikonfigurasikan dalam kelompok, dsb., tidak boleh diputuskan dengan menepuk kepala dan dada .
Mula-mula perkenalkan dua konsep: throughput dan latency rendah
Throughput = masa CPU menjalankan aplikasi pengguna / (masa CPU menjalankan aplikasi pengguna + masa kutipan sampah CPU)
Masa tindak balas = purata penggunaan masa GC
Biasanya, throughput diutamakan atau respons adalah Mengutamakan ini adalah dilema dalam JVM.
Apabila memori timbunan meningkat, jumlah yang boleh dikendalikan oleh gc pada satu masa menjadi lebih besar, dan daya pemprosesan adalah lebih tinggi, walau bagaimanapun, masa untuk satu gc akan menjadi lebih lama, menyebabkan masa menunggu yang lebih lama untuk urutan di belakang; Sebaliknya, jika ingatan timbunan kecil, masa untuk satu gc akan menjadi pendek , masa menunggu benang menunggu dalam baris gilir menjadi lebih pendek dan kelewatan dikurangkan, tetapi bilangan permintaan pada satu masa menjadi lebih kecil (tidak konsisten sepenuhnya).
Adalah mustahil untuk memberi keutamaan kepada throughput atau respons pada masa yang sama Ini adalah persoalan yang perlu ditimbang.
Konfigurasi pemungut sampah arus perdana ialah menggunakan ParNew dalam generasi baharu dan gabungan CMS pada generasi lama, atau menggunakan sepenuhnya pengumpul G1
Dari perspektif trend masa hadapan, G1 ialah rasmi Pengumpul sampah yang dikekalkan dan lebih dihormati.
Sistem perniagaan:
CMS terutamanya adalah pengumpul untuk generasi lama Generasi lama secara lalai, ia akan melakukan algoritma penyahperangan selepas algoritma FullGC untuk membersihkan serpihan memori.
CMS GC2. ralat program semasa penandaan serentak Rekod tanda bahagian objek yang terus beroperasi dan menyebabkan perubahan tanda. | Ya | Cepat | |
---|---|---|---|
4. Pengumpulan sampah | Pembersihan objek sampah serentak (algoritma tanda dan sapu) | Tidak |
Ringkasnya:
CM disyorkan untuk sistem perniagaan yang sensitif kepada kependaman;
untuk perkhidmatan memori besar yang memerlukan daya pemprosesan tinggi, gunakan pengitar semula G1!
Idea umum ialah:
Pertama sekali, parameter paling penting dan teras JVM ialah menilai memori dan peruntukan Langkah pertama adalah untuk menentukan Saiz timbunan, ini mesti dilakukan apabila sistem berada dalam talian, -Saiz timbunan awal Xm, saiz timbunan maksimum Xmx, perkhidmatan Java latar belakang biasanya ditetapkan sebagai separuh daripada memori sistem. ia akan menduduki sumber sistem pelayan, jika terlalu kecil, JVM tidak boleh digunakan dengan prestasi terbaik.
Kedua, anda perlu menentukan saiz generasi baharu -Xmn Parameter ini sangat kritikal dan sangat fleksibel Walaupun Sun secara rasmi mengesyorkan saiz 3/8, ia harus ditentukan mengikut senario perniagaan, untuk tanpa negara. atau perkhidmatan keadaan ringan (kini Untuk sistem perniagaan yang paling biasa (seperti aplikasi Web), generasi baharu secara amnya boleh diberikan 3/4 daripada saiz memori timbunan; untuk perkhidmatan stateful (sistem biasa seperti perkhidmatan IM, akses get laluan lapisan, dsb.) generasi baru boleh diberikan lalai Tetapkan nisbah kepada 1/3. Perkhidmatan ini bersifat stateful, yang bermaksud bahawa akan terdapat lebih banyak cache tempatan dan maklumat keadaan sesi yang disimpan dalam ingatan, jadi lebih banyak ruang harus disediakan dalam generasi lama untuk menyimpan objek ini.
Akhir sekali, tetapkan saiz memori tindanan -Xss dan tetapkan saiz tindanan bagi satu utas Nilai lalai adalah berkaitan dengan versi dan sistem JDK, dan biasanya lalai kepada 512~1024kb. Jika perkhidmatan latar belakang mempunyai beratus-ratus benang pemastautin, memori tindanan juga akan menduduki ratusan M dalam saiz.
Parameter JVM separuh ingatanSaiz maksimum memori timbunan Java | Memori OS 4/1 | separuh daripada memori OS | |
---|---|---|---|
1/3 daripada jumlah diskaun | sun mengesyorkan 3/8 | ||
-Xss | Saiz memori tindanan setiap utas | berkaitan dengan idk | sun |
Untuk memori 8G, biasanya cukup untuk memperuntukkan separuh daripada memori maksimum Kerana mesin masih menduduki jumlah memori tertentu, memori 4G biasanya diperuntukkan kepada JVM
Memperkenalkan pautan ujian tekanan prestasi, menguji pelajar tekan antara muka log masuk hingga 1 saat Kelajuan penjanaan objek ialah 60M, menggunakan pengitar semula gabungan ParNew+CMS
Konfigurasi parameter JVM biasa adalah seperti berikut:
-Xms3072M -Xmx3072M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8
Tetapan sedemikian boleh menyebabkan gc penuh yang kerap disebabkan oleh dinamik. prinsip penghakiman umur objek. kenapa?
Semasa ujian tekanan, kawasan Eden akan penuh dalam tempoh yang singkat (contohnya, selepas 20 saat apabila berjalan semula pada masa ini, objek tidak boleh diperuntukkan, dan MinorGC akan dicetuskan bahawa S1 memuatkan 100M selepas GC ini, dan ia akan lulus serta-merta dalam 20S. Objek 100M tambahan yang masih hidup + 100M di kawasan S1 tidak lagi berjaya dimasukkan ke dalam kawasan S2 mekanisme umur JVM akan dicetuskan dan sekumpulan objek kira-kira 100M akan ditolak ke generasi lama untuk penyimpanan , jika ia terus berjalan untuk tempoh masa, sistem boleh mencetuskan FullGC dalam masa sejam.
Apabila diperuntukkan mengikut nisbah lalai 8:1:1, kawasan yang terselamat hanyalah kira-kira 10% daripada 1G, iaitu puluhan hingga 100M,
如果 每次minor GC垃圾回收过后进入survivor对象很多,并且survivor对象大小很快超过 Survivor 的 50% , 那么会触发动态年龄判定规则,让部分对象进入老年代.
而一个GC过程中,可能部分WEB请求未处理完毕, 几十兆对象,进入survivor的概率,是非常大的,甚至是一定会发生的.
如何解决这个问题呢?为了让对象尽可能的在新生代的eden区和survivor区, 尽可能的让survivor区内存多一点,达到200兆左右,
于是我们可以更新下JVM参数设置:
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8 说明: ‐Xmn2048M ‐XX:SurvivorRatio=8 年轻代大小2g,eden与survivor的比例为8:1:1,也就是1.6g:0.2g:0.2g
survivor达到200m,如果几十兆对象到底survivor, survivor 也不一定超过 50%
这样可以防止每次垃圾回收过后,survivor对象太早超过 50% ,
这样就降低了因为对象动态年龄判断原则导致的对象频繁进入老年代的问题,
Peraturan penghakiman umur dinamik untuk objek yang memasuki generasi lama (ambang pengiraan umur promosi dinamik): Semasa GC Minor, apabila saiz objek dengan umur 1 hingga N dalam Survivor melebihi 50% daripada Survivor, objek lebih besar daripada atau sama dengan umur N akan diletakkan Memasuki usia tua.
Strategi pengoptimuman teras adalah untuk mengekalkan objek jangka pendek yang masih hidup sebanyak mungkin dan tidak memasuki generasi lama Dengan cara ini, objek ini akan dikitar semula semasa gc kecil dan tidak akan memasuki generasi dan punca lama gc penuh.
Sebutan khas di sini, parameter yang paling penting dan teras JVM adalah untuk menilai memori dan peruntukan
Langkah pertama adalah untuk menentukan saiz memori timbunan Inilah yang mesti dilakukan apabila sistem berada dalam talian, -Xms saiz timbunan awal, -Xmx Saiz timbunan maksimum biasanya dinyatakan sebagai separuh daripada memori sistem dalam perkhidmatan Java latar belakang Jika ia terlalu besar, ia akan menduduki sumber sistem pelayan Jika ia terlalu kecil, prestasi terbaik JVM tidak boleh digunakan.
Kedua, anda perlu menentukan saiz generasi baharu -Xmn Parameter ini sangat kritikal dan mempunyai fleksibiliti yang hebat Walaupun Sun secara rasmi mengesyorkan saiz 3/8, ia mesti ditentukan mengikut senario perniagaan:
.Perkhidmatan ini bersifat stateful, yang bermaksud bahawa lebih banyak cache setempat dan maklumat keadaan sesi akan disimpan dalam ingatan, yang bermaksud bahawa lebih banyak ruang harus disediakan untuk generasi lama untuk menyimpan objek ini.
-Saiz memori tindanan Xss, tetapkan saiz tindanan bagi satu utas Nilai lalai adalah berkaitan dengan versi dan sistem JDK, dan biasanya lalai kepada 512~1024kb. Jika perkhidmatan latar belakang mempunyai beratus-ratus benang pemastautin, memori tindanan juga akan menduduki ratusan M dalam saiz.
Anggapkan bahawa gc kecil mengambil masa dua puluh hingga tiga puluh saat, dan kebanyakan objek biasanya menjadi sampah dalam masa beberapa saat
Jika objek itu tidak dikitar semula untuk masa yang lama, contohnya, ia tidak dikitar semula selama 2. minit, ia boleh dianggap Objek ini adalah objek yang akan bertahan lama dan dengan itu dipindahkan ke generasi lama dan bukannya terus menduduki ruang kawasan yang terselamat.
所以,可以将默认的15岁改小一点,比如改为5,
那么意味着对象要经过5次minor gc才会进入老年代,整个时间也有一两分钟了(5*30s= 150s),和几秒的时间相比,对象已经存活了足够长时间了。
所以:可以适当调整JVM参数如下:
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8 ‐XX:MaxTenuringThreshold=5
对于多大的对象直接进入老年代(参数-XX:PretenureSizeThreshold),一般可以结合自己系统看下有没有什么大对象 生成,预估下大对象的大小,一般来说设置为1M就差不多了,很少有超过1M的大对象,
所以:可以适当调整JVM参数如下:
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8 ‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M
JDK8默认的垃圾回收器是-XX:+UseParallelGC(年轻代)和-XX:+UseParallelOldGC(老年代),
如果内存较大(超过4个G,只是经验 值),还是建议使用G1.
这里是4G以内,又是主打“低延时” 的业务系统,可以使用下面的组合:
ParNew+CMS(-XX:+UseParNewGC -XX:+UseConcMarkSweepGC)
新生代的采用ParNew回收器,工作流程就是经典复制算法,在三块区中进行流转回收,只不过采用多线程并行的方式加快了MinorGC速度。
老生代的采用CMS。再去优化老年代参数:比如老年代默认在标记清除以后会做整理,还可以在CMS的增加GC频次还是增加GC时长上做些取舍,
如下是响应优先的参数调优:
XX:CMSInitiatingOccupancyFraction=70
设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC)
XX:+UseCMSInitiatinpOccupancyOnly
和上面搭配使用,否则只生效一次
-XX:+AlwaysPreTouch
强制操作系统把内存真正分配给IVM,而不是用时才分配。
综上,只要年轻代参数设置合理,老年代CMS的参数设置基本都可以用默认值,如下所示:
‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8 ‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M ‐XX:+UseParNewGC ‐XX:+UseConcMarkSweepGC ‐XX:CMSInitiatingOccupancyFraction=70 ‐XX:+UseCMSInitiatingOccupancyOnly ‐XX:+AlwaysPreTouch
参数解释
1.‐Xms3072M ‐Xmx3072M
最小最大堆设置为3g,最大最小设置为一致防止内存抖动
2.‐Xss1M
线程栈1m
3.‐Xmn2048M ‐XX:SurvivorRatio=8
年轻代大小2g,eden与survivor的比例为8:1:1,也就是1.6g:0.2g:0.2g
4.-XX:MaxTenuringThreshold=5
年龄为5进入老年代 5.‐XX:PretenureSizeThreshold=1M
大于1m的大对象直接在老年代生成
6.‐XX:+UseParNewGC ‐ XX:+UseConcMarkSweepGC
使用ParNew+cms垃圾回收器组合‐XX:+UseParNewGC ‐XX:+UseConcMarkSweepGC
使用ParNew+cms垃圾回收器组合
7.‐XX:CMSInitiatingOccupancyFraction=70
老年代中对象达到这个比例后触发fullgc
8.‐XX:+UseCMSInitiatinpOccupancyOnly
老年代中对象达到这个比例后触发fullgc,每次
9.‐XX:+AlwaysPreTouch
‐XX:CMSIinitiatingOccupancyFraction=70
老年代中对象达到这个比例后触发fullgc‐XX:+AlwaysPreTouch kod> 强制操作系统把内存真正分配给IVM,而不是用时才分配。<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p>🎜step8:配置匀的配置匀的配置子志🎜🎜🎜额外增加了GC日志打印、OOM自动dump等配置内容,帮助进行问题排查🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-XX:+HeapDumpOnOutOfMemoryError</pre><div class="contentsignin">Salin selepas log masuk</div></div>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>在Out Of Memory,JVM快死掉的时候,输出Heap Dump到指定文件。</p>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>不然开发很多时候还真不知道怎么重现错误。</p>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>路径只指向目录,JVM会保持文件名的唯一性,叫java_pid${pid}.hprof。</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${LOGDIR}/</pre><div class="contentsignin">Salin selepas log masuk</div></div>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>因为如果指向特定的文件,而文件已存在,反而不能写入。</p>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>输出4G的HeapDump,会导致IO性能问题,在普通硬盘上,会造成20秒以上的硬盘IO跑满,</p>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>需要注意一下,但在容器环境下,这个也会影响同一宿主机上的其他容器。</p>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>GC的日志的输出也很重要:</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-Xloggc:/dev/xxx/gc.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails</pre><div class="contentsignin">Salin selepas log masuk</div></div>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>GC的日志实际上对系统性能影响不大,打日志对排查GC问题很重要。</p>
<h4 data-tool="mdnice编辑器" style='margin-top: 30px;margin-bottom: 15px;outline: 0px;font-weight: bold;font-size: 18px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);color: black;'>一份通用的JVM参数模板</h4>
<blockquote data-tool="mdnice编辑器" style='margin-top: 0px;margin-bottom: 20px;padding: 8px 10px 8px 15px;outline: 0px;border-left-width: 2px;border-left-color: rgb(239, 112, 96);color: rgb(106, 115, 125);font-size: 0.9em;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;text-align: left;white-space: normal;word-spacing: 0.8px;border-top: none;border-right: none;border-bottom: none;overflow: auto;background: rgb(255, 249, 249);letter-spacing: 0.5444px;'>
<p style="margin-right: 10px;margin-left: 10px;padding-top: 8px;padding-bottom: 8px;outline: 0px;line-height: 26px;color: rgb(53, 53, 53);font-size: 16px;">一般来说,大企业或者架构师团队,都会为项目的业务系统定制一份较为通用的JVM参数模板,但是许多小企业和团队可能就疏于这一块的设计,如果老板某一天突然让你负责定制一个新系统的JVM参数,你上网去搜大量的JVM调优文章或博客,结果发现都是零零散散的、不成体系的JVM参数讲解,根本下不了手,这个时候你就需要一份较为通用的JVM参数模板了,不能保证性能最佳,但是至少能让JVM这一层是稳定可控的,</p>
<p style="margin-right: 10px;margin-left: 10px;padding-top: 8px;padding-bottom: 8px;outline: 0px;line-height: 26px;color: rgb(53, 53, 53);font-size: 16px;">在这里给大家总结了一份模板:</p>
</blockquote>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'><span style="outline: 0px;font-weight: 700;color: rgb(248, 57, 41);">基于4C8G系统的ParNew+CMS回收器模板(响应优先),新生代大小根据业务灵活调整!</span></p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">-Xms4g
-Xmx4g
-Xmn2g
-Xss1m
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=10
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch
-XX:+HeapDumpOnOutOfMemoryError
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:gc.log</pre><div class="contentsignin">Salin selepas log masuk</div></div>
<h4 data-tool="mdnice编辑器" style='margin-top: 30px;margin-bottom: 15px;outline: 0px;font-weight: bold;font-size: 18px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);color: black;'>如果是GC的吞吐优先,推荐使用G1,基于8C16G系统的G1回收器模板:</h4>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>G1收集器自身已经有一套预测和调整机制了,因此我们首先的选择是相信它,</p>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>即调整-<code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>XX:MaxGCPauseMillis=N
参数,这也符合G1的目的——让GC调优尽量简单!
同时也不要自己显式设置新生代的大小(用-Xmn或-XX:NewRatio参数),
如果人为干预新生代的大小,会导致目标时间这个参数失效。
-Xms8g -Xmx8g -Xss1m -XX:+UseG1GC -XX:MaxGCPauseMillis=150 -XX:InitiatingHeapOccupancyPercent=40 -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc.log
G1参数 | 描述 | 默认值 |
---|---|---|
XX:MaxGCPauseMillis=N | 最大GC停顿时间。柔性目标,JVM满足90%,不保证100%。 | 200 |
-XX:nitiatingHeapOccupancyPercent=n | 当整个堆的空间使用百分比超过这个值时,就会融发MixGC | 45 |
Untuk -XX:MaxGCPauseMillis Untuk kod>, tetapan parameter mempunyai kecenderungan yang jelas: lebih rendah ↓: kelewatan adalah lebih rendah, tetapi MinorGC adalah kerap, MixGC mengitar semula kawasan lama kurang dan meningkatkan risiko GC Penuh. Tambah ↑: lebih banyak objek akan dikitar semula pada satu masa, tetapi keseluruhan masa tindak balas sistem juga akan dipanjangkan. <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:MaxGCPauseMillis
来说,参数的设置带有明显的倾向性:调低↓:延迟更低,但MinorGC频繁,MixGC回收老年代区减少,增大Full GC的风险。调高↑:单次回收更多的对象,但系统整体响应时间也会被拉长。
针对InitiatingHeapOccupancyPercent
InitiatingHeapOccupancyPercent
In erti kata lain, kesan melaraskan saiz parameter juga berbeza: menurunkan ↓: mencetuskan MixGC lebih awal, membazir CPU. Peningkatan ↑: Kumpul berbilang generasi kawasan kitar semula, meningkatkan risiko FullGC. 4. Idea Pengoptimuman: Biarkan objek jangka pendek dikitar semula dalam peringkat MinorGC (pada masa yang sama, objek yang masih hidup selepas dikitar semula
5 Proses penalaan yang diringkaskan setakat ini adalah berdasarkan peringkat ujian dan pengesahan sebelum pergi ke dalam talian, jadi kami cuba menetapkan parameter JVM mesin kepada nilai optimum sebelum pergi ke dalam talian!
Penalaan JVM hanyalah satu cara, tetapi tidak semua masalah boleh diselesaikan dengan penalaan JVM Kebanyakan aplikasi Java tidak memerlukan pengoptimuman JVM Kami boleh mengikuti beberapa prinsip berikut:
ZGC (Z Garbage Collector) ialah pemungut sampah yang dibangunkan oleh Oracle dengan kependaman rendah sebagai matlamat utamanya.
Ia adalah pengumpul berdasarkan susun atur memori Wilayah dinamik, (sementara) tanpa penjanaan umur, dan menggunakan teknologi seperti halangan baca, penunjuk dicelup dan pemetaan berbilang memori untuk melaksanakan algoritma isihan tanda serentak.
Baru ditambah dalam JDK 11, ia masih dalam peringkat percubaan
Ciri-ciri utama ialah: mengitar semula terabait memori (maksimum 4T), dan masa jeda tidak melebihi 10ms.
Kebaikan: jeda rendah, daya pemprosesan tinggi, sedikit memori tambahan yang digunakan semasa pengumpulan ZGC
Kelemahan: sampah terapung
Sekarang digunakan sangat sedikit, dan ia masih memerlukan masa penulisan untuk menjadi benar-benar popular.
Bagaimana untuk memilih dalam senario sebenar? Berikut adalah beberapa cadangan, saya harap ia akan membantu anda:
1 Jika saiz timbunan anda tidak terlalu besar (seperti 100MB), memilih pengumpul bersiri secara amnya paling cekap. Parameter: -XX:+UseSerialGC kod>. <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:+UseSerialGC
。
2、如果你的应用运行在单核的机器上,或者你的虚拟机核数只有 单核,选择串行收集器依然是合适的,这时候启用一些并行收集器没有任何收益。参数:-XX:+UseSerialGC
。
3、如果你的应用是“吞吐量”优先的,并且对较长时间的停顿没有什么特别的要求。选择并行收集器是比较好的。参数:-XX:+UseParallelGC
-XX:+UseSerialGC kod>. 🎜🎜3 Jika permohonan anda mengutamakan "throughput" dan tidak mempunyai keperluan khas untuk jeda yang lama. Lebih baik memilih pengumpul selari. Parameter: <code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>-XX:+UseParallelGC kod>. 🎜<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>4 Jika aplikasi anda mempunyai keperluan masa respons yang tinggi dan mahukan lebih sedikit jeda. Walaupun jeda 1 saat akan menyebabkan sejumlah besar permintaan gagal, jadi adalah munasabah untuk memilih G1, ZGC atau CMS. Walaupun jeda GC pengumpul ini biasanya lebih pendek, ia memerlukan beberapa sumber tambahan untuk mengendalikan kerja, dan daya pengeluaran biasanya lebih rendah. Parameter: <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:+UseConcMarkSweepGC
、 -XX:+UseG1GC
、 -XX:+UseZGC
dll. Daripada titik permulaan di atas, pelayan web biasa kami mempunyai keperluan yang sangat tinggi untuk responsif.
Selektiviti sebenarnya tertumpu pada CMS, G1, dan ZGC. Untuk beberapa tugas yang dijadualkan, menggunakan pengumpul selari adalah pilihan yang lebih baik.
Apakah itu metaspace? Apakah generasi kekal? Mengapa menggunakan metaspace dan bukannya penjanaan kekal?
Mari kita semak semula kawasan kaedah dahulu dan lihat gambarajah memori data semasa mesin maya sedang berjalan, seperti berikut:
Kawasan kaedah, seperti timbunan, ialah kawasan memori yang dikongsi oleh setiap utas Ia digunakan untuk menyimpan data seperti maklumat kelas, pemalar, pembolehubah statik dan kod tersusun tepat dalam masa yang telah dimuatkan oleh. mesin maya.
Apakah generasi kekal? Apakah kaitannya dengan kawasan kaedah?
Jika anda membangun dan menggunakan mesin maya HotSpot, ramai pengaturcara memanggil kawasan kaedah sebagai generasi kekal.
Boleh dikatakan bahawa kawasan kaedah adalah spesifikasi, dan generasi kekal adalah pelaksanaan spesifikasi Hotspot.
Dalam Java7 dan versi sebelumnya, kawasan kaedah dilaksanakan dalam generasi kekal.
Apakah itu metaspace? Apakah kaitannya dengan kawasan kaedah?
Untuk Java8, HotSpots membatalkan penjanaan kekal dan menggantikannya dengan metaspace.
Dalam erti kata lain, kawasan kaedah masih ada, tetapi pelaksanaannya telah berubah, daripada generasi kekal kepada metaspace.
Kenapa generasi kekal digantikan dengan metaspace?
Kaedah kaedah generasi kekal adalah bersebelahan dengan ingatan fizikal yang digunakan oleh timbunan.
Generasi kekal dikonfigurasikan melalui dua parameter berikut~
-XX:PremSize kod>: Tetapkan saiz awal generasi kekal<code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:PremSize
:设置永久代的初始大小-XX:MaxPermSize
-XX:MaxPermSize
: Tetapkan nilai maksimum generasi kekal, lalai ialah 64MUntuk generasi kekal
, jika banyak kelas dijana secara dinamik,java.lang .OutOfMemoryError berkemungkinan berlaku :Ralat ruang PermGen
, kerana konfigurasi ruang penjanaan kekal adalah terhad. Senario yang paling tipikal ialah apabila terdapat banyak halaman jsp dalam pembangunan web.Selepas JDK8, kawasan kaedah wujud dalam metaspace.
Memori fizikal tidak lagi berterusan dengan timbunan, tetapi wujud secara langsung dalam ingatan tempatan Secara teorinya, saiz mesin 🎜🎜Anda boleh menetapkan saiz metaspace melalui parameter berikut:🎜-XX:MetaspaceSize kod>, saiz ruang awal Apabila nilai ini dicapai, kutipan sampah akan dicetuskan untuk memunggah jenis Pada masa yang sama, GC akan melaraskan nilai: jika sejumlah besar ruang dikeluarkan, nilai akan dikurangkan dengan sewajarnya. ; jika sejumlah kecil ruang dikeluarkan, maka Apabila ia tidak melebihi MaxMetaspaceSize, tingkatkan nilai ini dengan sewajarnya. <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:MetaspaceSize
,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。-XX:MaxMetaspaceSize
,最大空间,默认是没有限制的。-XX:MinMetaspaceFreeRatio
,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集-XX:MaxMetaspaceFreeRatio
-XX:MaxMetaspaceSize, ruang maksimum, adalah tidak terhad secara lalai. <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p>
<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p>
<code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono consolas monaco menlo monospace break-all rgb>-XX:MinMetaspaceFreeNisbah, selepas GC, peratusan minimum kapasiti ruang Metaspace yang tinggal dikurangkan kepada kutipan sampah yang disebabkan oleh ruang yang diperuntukkan<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p>🎜🎜<code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px ;garis besar: 0px;saiz fon: 14px;jejari sempadan: 4px;warna latar belakang: rgba(27, 31, 35, 0.05);fon-family: " operator mono consolas monaco menlo monospace break-all rgb>-XX:MaxMetaspaceFreeRatio
, selepas GC, peratusan kapasiti ruang baki Metaspace maksimum dikurangkan kepada jumlah yang disebabkan oleh mengosongkan ruang Pengumpulan Sampah🎜🎜🎜🎜Jadi, mengapa menggunakan metaspace untuk menggantikan generasi kekal? 🎜🎜Di permukaan adalah untuk mengelakkan pengecualian OOM. 🎜🎜Oleh kerana PermSize dan MaxPermSize biasanya digunakan untuk menetapkan saiz penjanaan kekal, yang menentukan had atas penjanaan kekal, tetapi tidak selalu mungkin untuk mengetahui berapa besar ia harus ditetapkan jika anda menggunakan nilai lalai , adalah mudah untuk menghadapi ralat OOM. 🎜Apabila menggunakan metaspace, bilangan kelas metadata yang boleh dimuatkan tidak lagi dikawal oleh MaxPermSize, tetapi oleh ruang sebenar sistem yang tersedia.
Proses kutipan sampah akan melibatkan pergerakan objek.
Untuk memastikan ketepatan kemas kini rujukan objek, semua urutan pengguna mesti dijeda Jeda seperti ini diterangkan oleh pereka mesin maya sebagai Stop The World. Juga dirujuk sebagai STW.
Dalam HotSpot, terdapat struktur data (jadual pemetaan) yang dipanggil OopMap.
Setelah tindakan pemuatan kelas selesai, HotSpot akan mengira jenis data yang diimbangi dalam objek dan merekodkannya ke OopMap.
Semasa proses penyusunan tepat dalam masa, OopMap juga akan dijana di lokasi tertentu, merekodkan lokasi pada tindanan dan daftar yang menjadi rujukan.
Kedudukan khusus ini terutamanya pada: 1. Penghujung gelung (gelung tidak dikira)
2. Sebelum kaedah kembali / selepas memanggil arahan panggilan kaedah
3 Lokasi di mana pengecualian boleh dilemparkan
Lokasi ini dipanggil safepoints.
Apabila atur cara pengguna dilaksanakan, anda tidak boleh menjeda dan memulakan kutipan sampah di mana-mana kedudukan dalam aliran arahan kod, tetapi ia mesti dilaksanakan ke titik selamat sebelum ia boleh dijeda.
Atas ialah kandungan terperinci Terminal Alibaba: 1 juta permintaan log masuk setiap hari, memori 8G, bagaimana untuk menetapkan parameter JVM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!