નિદાન મલ્ટિપ્લેયર ગેમ સર્વર લોડ હેઠળ ક્રેશ
આની કલ્પના કરો: તમે એક ઉત્તેજક મલ્ટિપ્લેયર ગેમ હોસ્ટ કરી રહ્યાં છો, ખેલાડીઓ ઊંડે ડૂબી ગયા છે, અને અચાનક, જોડાણો ઘટવા લાગે છે. 🚨 તમારું સર્વર ભારે ભાર હેઠળ સંઘર્ષ કરે છે, ખેલાડીઓને સ્થિર અવસ્થામાં છોડી દે છે. આ દુઃસ્વપ્ન દૃશ્ય ગેમપ્લેમાં ખલેલ પહોંચાડે છે અને તમારા સમુદાયમાં વિશ્વાસને ખતમ કરે છે.
તાજેતરમાં, યુનિટી ક્લાયન્ટ્સ અને નેટી દ્વારા સંચાલિત મારા પોતાના મલ્ટિપ્લેયર સર્વરને TCP સ્તર તરીકે સંચાલિત કરતી વખતે, મને સમાન પડકારનો સામનો કરવો પડ્યો. પીક સમયે, ક્લાયંટ ફરીથી કનેક્ટ થઈ શક્યા ન હતા અને સંદેશાઓ વહેતા બંધ થઈ ગયા હતા. તૂતક પર ઊભા રહીને ડૂબતા જહાજને પેચ કરવાનો પ્રયાસ કરવાનું મન થયું. 🚢
16 vCPUs અને 32GB મેમરી સાથે મજબૂત હાર્ડવેર હોવા છતાં, સમસ્યા યથાવત રહી. મારા ક્લાઉડ ડેશબોર્ડે CPU વપરાશને વ્યવસ્થિત 25% પર દર્શાવ્યો, તેમ છતાં ઇન-ગેમ લેગએ એક અલગ વાર્તા કહી. આનાથી મુશ્કેલીનિવારણ વધુ મુશ્કેલ બન્યું. તે સ્પષ્ટ હતું કે સર્વર લોડ ચોક્કસ થ્રેડોમાં કેન્દ્રિત હતું, પરંતુ ગુનેગારને ઓળખવા માટે ઊંડા ડાઇવિંગની જરૂર હતી.
આ પોસ્ટમાં, થ્રેડ-વિશિષ્ટ CPU વપરાશના વિશ્લેષણથી લઈને નેટ્ટી રૂપરેખાંકન સેટિંગ્સની ફરી મુલાકાત લેવા સુધી, મેં આ સમસ્યાને કેવી રીતે હલ કરી તે વિશે હું તમને લઈ જઈશ. પછી ભલે તમે અનુભવી વિકાસકર્તા હો અથવા ઉચ્ચ-લોડ સર્વર્સનું સંચાલન કરવા માટે નવા હોવ, આ પ્રવાસ તમને તમારા પોતાના મલ્ટિપ્લેયર પ્રોજેક્ટ્સને સ્થિર કરવામાં મદદ કરવા માટે આંતરદૃષ્ટિ પ્રદાન કરશે. 🌟
આદેશ | વર્ણન |
---|---|
NioEventLoopGroup | આ નેટી ક્લાસ નોન-બ્લોકિંગ I/O ઓપરેશન્સને હેન્ડલ કરવા માટે થ્રેડોનો પૂલ બનાવે છે. તે ઉચ્ચ સંમતિ માટે ઑપ્ટિમાઇઝ છે અને થ્રેડ વિવાદને ઘટાડે છે. |
ChannelOption.SO_BACKLOG | ઇનકમિંગ કનેક્શન વિનંતીઓ માટે મહત્તમ કતાર લંબાઈનો ઉલ્લેખ કરે છે. આને સમાયોજિત કરવાથી ટ્રાફિકમાં અચાનક થતા સ્પાઇક્સને વધુ અસરકારક રીતે હેન્ડલ કરવામાં મદદ મળે છે. |
ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK | રાઇટ બફર માટે ઉચ્ચ થ્રેશોલ્ડ સેટ કરે છે. જો બફરમાંનો ડેટા આ કદ કરતાં વધી જાય, તો લખવામાં વિલંબ થાય છે, જે ઉચ્ચ ભાર હેઠળ સિસ્ટમને વધુ પડતા અટકાવે છે. |
ChannelOption.WRITE_BUFFER_LOW_WATER_MARK | સસ્પેન્ડ કરવામાં આવ્યા પછી લખવાનું ફરી શરૂ કરવા માટે નીચલા થ્રેશોલ્ડને વ્યાખ્યાયિત કરે છે. આ ભારે ટ્રાફિક દરમિયાન લેટન્સી સ્પાઇક્સનું જોખમ ઘટાડે છે. |
LinkedBlockingQueue | સંદેશાઓને અસુમેળ રીતે સંગ્રહિત કરવા અને પ્રક્રિયા કરવા માટે ઉપયોગમાં લેવાતો થ્રેડ-સેફ કતાર અમલીકરણ. તે I/O ઓપરેશન્સથી અલગ મેસેજ પ્રોસેસિંગમાં મદદ કરે છે. |
channelReadComplete | ચેનલે બધા સંદેશા વાંચવાનું સમાપ્ત કર્યા પછી નેટી કૉલબેક પદ્ધતિ ટ્રિગર થઈ. તેનો ઉપયોગ બલ્કમાં કતારબદ્ધ સંદેશાઓ પર પ્રક્રિયા કરવા માટે થાય છે. |
ChannelFuture | નેટ્ટીમાં અસુમેળ કામગીરીના પરિણામનું પ્રતિનિધિત્વ કરે છે. આનો ઉપયોગ લખવા-અને-ફ્લશ કૉલ્સને હેન્ડલ કરવા માટે થાય છે અને ખાતરી કરે છે કે તે સફળતાપૂર્વક પૂર્ણ થાય છે. |
Unpooled.copiedBuffer | ડેટા ધરાવતું બફર બનાવે છે જે નેટવર્ક પર મોકલી શકાય છે. તેનો ઉપયોગ સ્ટ્રીંગ્સ અથવા બાઈનરી ડેટાને નેટ્ટી-સુસંગત ફોર્મેટમાં કન્વર્ટ કરવા માટે થાય છે. |
ServerBootstrap | સર્વર ચેનલોને રૂપરેખાંકિત કરવા અને પ્રારંભ કરવા માટે નેટ્ટીમાં કેન્દ્રીય વર્ગ. તે વિકલ્પો, હેન્ડલર્સ સેટ કરવામાં અને સર્વરને ચોક્કસ પોર્ટ સાથે જોડવામાં મદદ કરે છે. |
shutdownGracefully | થ્રેડોના આકસ્મિક સમાપ્તિને ટાળીને, આકર્ષક રીતે સંસાધનોને મુક્ત કરીને ઇવેન્ટ લૂપ જૂથોના સ્વચ્છ શટડાઉનની ખાતરી કરે છે. |
સ્થિરતા અને પ્રદર્શન માટે નેટી સર્વરને ઑપ્ટિમાઇઝ કરવું
પ્રથમ સ્ક્રિપ્ટ તેના થ્રેડ પૂલ ગોઠવણીને ઑપ્ટિમાઇઝ કરીને નેટી સર્વરની કાર્યક્ષમતા સુધારવા પર ધ્યાન કેન્દ્રિત કરે છે. સિંગલ-થ્રેડેડનો ઉપયોગ કરીને NioEventLoopGroup બોસ જૂથ માટે અને વર્કર થ્રેડોને ચાર સુધી મર્યાદિત કરવા માટે, સર્વર સિસ્ટમ સંસાધનોને ઓવરલોડ કર્યા વિના ઇનકમિંગ કનેક્શન્સને અસરકારક રીતે હેન્ડલ કરી શકે છે. આ વ્યૂહરચના ખાસ કરીને ઉપયોગી છે જ્યારે સર્વર ભારે ભાર હેઠળ કામ કરે છે, કારણ કે તે થ્રેડ વિવાદને અટકાવે છે અને CPU વપરાશ સ્પાઇક્સ ઘટાડે છે. ઉદાહરણ તરીકે, જો કોઈ મલ્ટિપ્લેયર ગેમ ટુર્નામેન્ટ દરમિયાન પ્લેયર કનેક્શન્સમાં વધારો મેળવે છે, તો આ ગોઠવણી થ્રેડ ફાળવણીને અસરકારક રીતે સંચાલિત કરીને સ્થિરતાને સુનિશ્ચિત કરે છે. 🚀
બીજી સ્ક્રિપ્ટમાં, ધ્યાન બફર મેનેજમેન્ટ તરફ જાય છે. નેટીની ચેનલ વિકલ્પ.WRITE_BUFFER_HIGH_WATER_MARK અને LOW_WATER_MARK ડેટા ફ્લોને અસરકારક રીતે નિયંત્રિત કરવા માટે લીવરેજ કરવામાં આવે છે. જ્યારે સર્વર ડેટા લખવાનું થોભાવે છે અથવા ફરી શરૂ કરે છે ત્યારે આ વિકલ્પો થ્રેશોલ્ડ સેટ કરે છે, જે ઉચ્ચ સંદેશ થ્રુપુટ દરમિયાન બેકપ્રેશરને રોકવા માટે મહત્વપૂર્ણ છે. એવા દૃશ્યની કલ્પના કરો કે જ્યાં ખેલાડીઓ ઝડપથી ચેટ સંદેશાઓ અને ગેમ અપડેટ્સની આપલે કરી રહ્યાં છે. આ નિયંત્રણો વિના, સર્વર અભિભૂત થઈ શકે છે અને સંદેશામાં વિલંબ અથવા કનેક્શન ડ્રોપનું કારણ બની શકે છે. આ અભિગમ ખેલાડીઓ માટે એકંદર ગેમિંગ અનુભવને વધારતા, સરળ સંચાર જાળવવામાં મદદ કરે છે.
ત્રીજી સ્ક્રિપ્ટ a નો ઉપયોગ કરીને અસુમેળ સંદેશ કતારનો અમલ કરીને એક નવું પરિમાણ રજૂ કરે છે LinkedBlockingQueue. આ સોલ્યુશન I/O ઑપરેશન્સમાંથી મેસેજ પ્રોસેસિંગને અલગ કરે છે, એ સુનિશ્ચિત કરે છે કે આવનારા ક્લાયન્ટ સંદેશાઓ અન્ય ઑપરેશન્સને બ્લૉક કર્યા વિના અસરકારક રીતે હેન્ડલ કરવામાં આવે છે. દાખલા તરીકે, જ્યારે કોઈ ખેલાડી જટિલ ક્રિયા આદેશ મોકલે છે, ત્યારે અન્ય ખેલાડીઓ માટે વિલંબને ટાળીને, સંદેશને કતારબદ્ધ અને અસુમેળ રીતે પ્રક્રિયા કરવામાં આવે છે. આ મોડ્યુલર ડિઝાઇન ડીબગીંગ અને ભાવિ વિશેષતા ઉમેરણોને પણ સરળ બનાવે છે, જેમ કે કતારમાં અમુક પ્રકારના સંદેશાઓને પ્રાથમિકતા આપવી. 🛠️
એકંદરે, આ સ્ક્રિપ્ટો નેટી-આધારિત સર્વરમાં કનેક્શન સ્થિરતા અને સંસાધન સંચાલનના પડકારોને સંબોધવા માટે વિવિધ પદ્ધતિઓ દર્શાવે છે. થ્રેડ ઑપ્ટિમાઇઝેશન, બફર કંટ્રોલ અને અસિંક્રોનસ પ્રોસેસિંગને સંયોજિત કરીને, સર્વર ઉચ્ચ ટ્રાફિક દૃશ્યોને હેન્ડલ કરવા માટે વધુ સારી રીતે સજ્જ છે. આ સોલ્યુશન્સ મોડ્યુલર છે, જે વિકાસકર્તાઓને તેમના સર્વરની ચોક્કસ જરૂરિયાતોને આધારે તેમને વધતા જતા અમલીકરણની મંજૂરી આપે છે. ભલે તમે મલ્ટિપ્લેયર ગેમ, ચેટ એપ્લિકેશન અથવા કોઈપણ રીઅલ-ટાઇમ સિસ્ટમનું સંચાલન કરી રહ્યાં હોવ, આ અભિગમો નોંધપાત્ર સ્થિરતા અને પ્રદર્શન સુધારણા પ્રદાન કરી શકે છે.
નેટ્ટી સર્વર કનેક્શનને એડ્રેસીંગ હેવી લોડ હેઠળ ડ્રોપ કરે છે
ઉકેલ 1: જાવામાં થ્રેડ પૂલ ઓપ્ટિમાઇઝેશનનો ઉપયોગ કરવો
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public class OptimizedNettyServer {
public static void main(String[] args) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1); // Single-threaded boss group
EventLoopGroup workerGroup = new NioEventLoopGroup(4); // Limited worker threads
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.TCP_NODELAY, true)
.childHandler(new SimpleTCPInitializer());
bootstrap.bind(8080).sync();
System.out.println("Server started on port 8080");
} catch (Exception e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
નેટી બફર ફાળવણીને સમાયોજિત કરીને CPU વપરાશ ઘટાડવો
સોલ્યુશન 2: નેટીના રાઈટ બફર અને બેકલોગ સાઈઝને ટ્વીક કરવું
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public class AdjustedNettyServer {
public static void main(String[] args) {
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024)
.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024)
.childHandler(new SimpleTCPInitializer());
bootstrap.bind(8080).sync();
System.out.println("Server with optimized buffers started on port 8080");
} catch (Exception e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
સુધારેલ સંદેશ હેન્ડલિંગ માટે સંદેશ કતારનો અમલ
ઉકેલ 3: અસુમેળ ક્લાયન્ટ કોમ્યુનિકેશન માટે સંદેશ કતાર ઉમેરવી
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
public class AsyncMessageHandler extends SimpleChannelInboundHandler<String> {
private final BlockingQueue<String> messageQueue = new LinkedBlockingQueue<>();
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
messageQueue.offer(msg); // Queue the incoming message
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
while (!messageQueue.isEmpty()) {
String response = processMessage(messageQueue.poll());
ctx.writeAndFlush(response);
}
}
private String processMessage(String msg) {
return "Processed: " + msg;
}
}
નેટ્ટીના ઇવેન્ટલૂપગ્રુપમાં થ્રેડ બોટલનેક્સની શોધખોળ
મલ્ટિપ્લેયર સર્વર સમસ્યાને ડિબગ કરવાનું એક નિર્ણાયક પાસું છે જેમ કે વારંવાર કનેક્શન ડ્રોપ થ્રેડ મેનેજમેન્ટનું વિશ્લેષણ કરવું નેટી. આ NioEventLoopGroup બિન-અવરોધિત I/O કામગીરીને હેન્ડલ કરવાની કરોડરજ્જુ છે. ભારે ભાર હેઠળ, આ જૂથમાં દરેક થ્રેડ બહુવિધ ચેનલોનું સંચાલન કરે છે, અસુમેળ રીતે વાંચવા અને લખવાની ઘટનાઓની પ્રક્રિયા કરે છે. જો કે, વધુ પડતો CPU ઉપયોગ, આ કિસ્સામાં અવલોકન કર્યા મુજબ, અવરોધો અથવા ખોટી ગોઠવણી કરેલ થ્રેડ પુલ સૂચવી શકે છે. આને ઘટાડવા માટે, વિકાસકર્તાઓએ થ્રેડ-ટુ-કોર રેશિયો સાથે પ્રયોગ કરવો જોઈએ. ઉદાહરણ તરીકે, 16-કોર સીપીયુ કાર્યક્ષમ રીતે કાર્યક્ષમ રીતે વિતરિત કરવા માટે બોસ અને વર્કર થ્રેડોના 1:2 રેશિયોથી શરૂ થઈ શકે છે. 🔄
થ્રેડ ફાળવણી ઉપરાંત, બેકલોગ થયેલા જોડાણોનું યોગ્ય સંચાલન મહત્વપૂર્ણ છે. નેટી પૂરી પાડે છે ChannelOption.SO_BACKLOG બાકી જોડાણોની મહત્તમ સંખ્યાને વ્યાખ્યાયિત કરવા માટે સેટિંગ. આ ટ્રાફિક સ્પાઇક્સ દરમિયાન ઓવરલોડને અટકાવે છે. દાખલા તરીકે, બેકલોગને 6144 સુધી વધારીને, આપેલ રૂપરેખાંકન પ્રમાણે, ગેમ લોન્ચ અથવા વીકએન્ડ ઈવેન્ટ્સ જેવા સંજોગોમાં અચાનક ખેલાડીઓની વૃદ્ધિને સમાવે છે. ના ઉપયોગ સાથે જોડાય છે ChannelOption.SO_KEEPALIVE, જે લાંબા સમયથી ક્લાયંટ-સર્વર કનેક્શન્સને જાળવી રાખે છે, આ સેટઅપ તણાવ હેઠળ સર્વરની સ્થિરતાને નોંધપાત્ર રીતે સુધારી શકે છે. 💡
અન્ય વારંવાર અવગણવામાં આવતું ક્ષેત્ર વ્યક્તિગત થ્રેડ પ્રદર્શનનું નિરીક્ષણ અને પ્રોફાઇલિંગ છે. JVisualVM અથવા નેટ્ટીના બિલ્ટ-ઇન મેટ્રિક્સ જેવા સાધનો વધુ પડતા CPU સાયકલનો ઉપયોગ કરતા થ્રેડોને ઓળખી શકે છે. ઉદાહરણ તરીકે, જો કોઈ ચોક્કસ કામદાર થ્રેડ અન્ય કરતાં વધુ કનેક્શન્સ હેન્ડલ કરે છે, કનેક્શન લોડ બેલેન્સિંગની રજૂઆત અથવા ચોક્કસ વર્કલોડ સોંપવાથી અસમાન સંસાધનનો ઉપયોગ અટકાવી શકાય છે. સમયાંતરે ડાયગ્નોસ્ટિક્સનો અમલ કરવાથી સર્વર વધતા પ્લેયર બેઝને અસરકારક રીતે સ્વીકારે છે તેની ખાતરી કરે છે.
નેટી સર્વર ઓપ્ટિમાઇઝેશન વિશે સામાન્ય પ્રશ્નો
- શું કરે છે ChannelOption.SO_BACKLOG કરવું?
- તે આવનારા જોડાણો માટે કતારનું કદ સુયોજિત કરે છે. ઉચ્ચ મૂલ્ય એ સુનિશ્ચિત કરે છે કે સર્વર કનેક્શન છોડ્યા વિના ટ્રાફિક વિસ્ફોટને નિયંત્રિત કરી શકે છે.
- કેવી રીતે કરે છે NioEventLoopGroup કામગીરી સુધારવા?
- તે I/O કાર્યોને બિન-અવરોધિત રીતે પ્રક્રિયા કરે છે, ઓછા થ્રેડોને બહુવિધ ચેનલોને અસરકારક રીતે સંચાલિત કરવાની મંજૂરી આપે છે.
- શા માટે ઉપયોગ કરો ChannelOption.SO_KEEPALIVE?
- તે સુનિશ્ચિત કરે છે કે નિષ્ક્રિય જોડાણો જીવંત રહે છે, ખાસ કરીને મલ્ટિપ્લેયર એપ્લિકેશન્સમાં અકાળે ડિસ્કનેક્ટ થતા અટકાવે છે.
- હું કેવી રીતે મોનીટર કરી શકું worker threads નેટ્ટીમાં?
- વધુ પડતા ઉપયોગમાં લેવાયેલા થ્રેડોને ઓળખવા અને વર્કલોડને સમાનરૂપે વિતરિત કરવા માટે JVisualVM અથવા થ્રેડ-વિશિષ્ટ પ્રોફાઇલિંગ જેવા સાધનોનો ઉપયોગ કરો.
- માં ઉચ્ચ CPU વપરાશનું કારણ શું બની શકે છે NioEventLoopGroup?
- અતિશય સમવર્તી જોડાણો, બેકપ્રેશર મિકેનિઝમનો અભાવ, અથવા બિન-ઓપ્ટિમાઇઝ થ્રેડ પૂલ ઉચ્ચ CPU વપરાશ તરફ દોરી શકે છે.
વિશ્વસનીય મલ્ટિપ્લેયર સર્વર પ્રદર્શનની ખાતરી કરવી
નેટી સર્વરને ભારે ભાર હેઠળ સ્થિર કરવા માટે થ્રેડ પુલને ફાઇન-ટ્યુનિંગ કરવું, બફર સેટિંગ્સને સમાયોજિત કરવી અને ઉચ્ચ CPU વપરાશનું નિદાન કરવું શામેલ છે. આ તત્વોને સંબોધવાથી કનેક્શન ડ્રોપ અટકાવી શકાય છે અને સર્વર અને ક્લાયંટ વચ્ચે સરળ સંચાર સુનિશ્ચિત કરી શકાય છે, પીક વપરાશ દરમિયાન પણ. 🛠️
યોગ્ય ઑપ્ટિમાઇઝેશન અને ટૂલ્સ સાથે, તમે અસ્થિર સિસ્ટમને મલ્ટિપ્લેયર ગેમિંગ માટે વિશ્વસનીય પ્લેટફોર્મમાં રૂપાંતરિત કરી શકો છો. ચાવી એ સંસાધન કાર્યક્ષમતા સાથે પ્રદર્શનને સંતુલિત કરવામાં આવેલું છે જ્યારે વપરાશકર્તાની વધતી જતી માંગ માટે રૂપરેખાંકનોને અનુકૂલિત કરવામાં આવે છે.
નેટી સર્વર ઓપ્ટિમાઇઝેશન માટે સ્ત્રોતો અને સંદર્ભો
- નેટ્ટી સર્વર રૂપરેખાંકનોને ઑપ્ટિમાઇઝ કરવા અને કનેક્શન ડ્રોપ્સને હેન્ડલિંગ કરવા પર વિગતવાર આંતરદૃષ્ટિનો સંદર્ભ આપવામાં આવ્યો હતો નેટી વપરાશકર્તા માર્ગદર્શિકા .
- થ્રેડ પૂલ અને ઇવેન્ટ લૂપ્સનું સંચાલન કરવા માટેની શ્રેષ્ઠ પદ્ધતિઓ આમાં શેર કરેલી માર્ગદર્શિકા દ્વારા પ્રેરિત હતી ડીઝોનની નેટી થ્રેડ મોડલ માર્ગદર્શિકા .
- c3p0 ડેટાબેઝ કનેક્શન પુલિંગ પ્રોપર્ટીઝ પરની માહિતી આમાંથી લેવામાં આવી હતી c3p0 સત્તાવાર દસ્તાવેજીકરણ .
- પર્ફોર્મન્સ ટ્યુનિંગ માટે ChannelOption સેટિંગ્સનો ઉપયોગ કરવાના ઉદાહરણોમાંથી સ્વીકારવામાં આવ્યા હતા નેટી પર સ્ટેક ઓવરફ્લો ચર્ચાઓ .
- જાવા એપ્લીકેશનોમાં ઉચ્ચ-સીપીયુ વપરાશના દૃશ્યોને ડીબગ કરવા માટેની સામાન્ય વ્યૂહરચનાઓની સમીક્ષા અહીંથી કરવામાં આવી હતી. ઓરેકલની JVisualVM માર્ગદર્શિકા .