ਜਾਵਾ ਬੈਂਚਮਾਰਕਸ ਵਿੱਚ ਮੈਮੋਰੀ ਚੁਣੌਤੀਆਂ ਨੂੰ ਸਮਝਣਾ
ਜਾਵਾ ਵਿੱਚ ਬੈਂਚਮਾਰਕਿੰਗ ਇੱਕ ਗਿਆਨਵਾਨ ਅਨੁਭਵ ਹੋ ਸਕਦਾ ਹੈ, ਤੁਹਾਡੇ ਕੋਡ ਦੇ ਪ੍ਰਦਰਸ਼ਨ ਦੀਆਂ ਬਾਰੀਕੀਆਂ ਨੂੰ ਪ੍ਰਗਟ ਕਰਦਾ ਹੈ। ਹਾਲਾਂਕਿ, ਅਚਾਨਕ ਮੁੱਦੇ, ਜਿਵੇਂ ਕਿ ਦੁਹਰਾਓ ਦੇ ਵਿਚਕਾਰ ਮੈਮੋਰੀ ਇਕੱਠਾ ਹੋਣਾ, ਨਤੀਜਿਆਂ ਨੂੰ ਭਰੋਸੇਯੋਗ ਨਹੀਂ ਬਣਾ ਸਕਦਾ ਹੈ। 😓
Java Microbenchmark Harness (JMH) ਵਰਗੇ ਟੂਲਸ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ, ਤੁਸੀਂ ਦੁਹਰਾਓ ਵਿੱਚ ਹੀਪ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਵਿੱਚ ਹੌਲੀ-ਹੌਲੀ ਵਾਧਾ ਦੇਖ ਸਕਦੇ ਹੋ। ਇਹ ਵਿਵਹਾਰ ਗੁੰਮਰਾਹਕੁੰਨ ਮਾਪਾਂ ਦੀ ਅਗਵਾਈ ਕਰ ਸਕਦਾ ਹੈ, ਖਾਸ ਕਰਕੇ ਜਦੋਂ ਹੀਪ ਮੈਮੋਰੀ ਨੂੰ ਪ੍ਰੋਫਾਈਲ ਕਰਨਾ। ਸਮੱਸਿਆ ਅਸਧਾਰਨ ਨਹੀਂ ਹੈ, ਪਰ ਇਸ ਨੂੰ ਅਕਸਰ ਉਦੋਂ ਤੱਕ ਨਜ਼ਰਅੰਦਾਜ਼ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਤੱਕ ਇਹ ਬੈਂਚਮਾਰਕ ਵਿੱਚ ਵਿਘਨ ਨਹੀਂ ਪਾਉਂਦਾ।
ਇਸ ਅਸਲ-ਜੀਵਨ ਦੇ ਦ੍ਰਿਸ਼ 'ਤੇ ਵਿਚਾਰ ਕਰੋ: ਤੁਸੀਂ ਹੀਪ ਮੈਮੋਰੀ ਵਰਤੋਂ ਦਾ ਵਿਸ਼ਲੇਸ਼ਣ ਕਰਨ ਲਈ JMH ਬੈਂਚਮਾਰਕ ਚਲਾ ਰਹੇ ਹੋ। ਹਰੇਕ ਵਾਰਮਅੱਪ ਅਤੇ ਮਾਪ ਦੁਹਰਾਓ ਇੱਕ ਵਧਦੀ ਬੇਸਲਾਈਨ ਮੈਮੋਰੀ ਫੁੱਟਪ੍ਰਿੰਟ ਦਿਖਾਉਂਦਾ ਹੈ। ਅੰਤਮ ਦੁਹਰਾਓ ਦੁਆਰਾ, ਵਰਤਿਆ ਗਿਆ ਢੇਰ ਮਹੱਤਵਪੂਰਨ ਤੌਰ 'ਤੇ ਵਧਿਆ ਹੈ, ਨਤੀਜਿਆਂ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰਦਾ ਹੈ। ਕਾਰਨ ਦੀ ਪਛਾਣ ਕਰਨਾ ਚੁਣੌਤੀਪੂਰਨ ਹੈ, ਅਤੇ ਇਸ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਸਹੀ ਕਦਮਾਂ ਦੀ ਲੋੜ ਹੈ।
ਇਹ ਗਾਈਡ JMH ਬੈਂਚਮਾਰਕਾਂ ਵਿੱਚ ਅਜਿਹੇ ਮੈਮੋਰੀ ਮੁੱਦਿਆਂ ਨੂੰ ਘਟਾਉਣ ਲਈ ਵਿਹਾਰਕ ਰਣਨੀਤੀਆਂ ਦੀ ਪੜਚੋਲ ਕਰਦੀ ਹੈ। ਉਦਾਹਰਣਾਂ ਅਤੇ ਹੱਲਾਂ ਤੋਂ ਡਰਾਇੰਗ, ਇਹ ਸੂਝ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ ਜੋ ਨਾ ਸਿਰਫ ਮੈਮੋਰੀ ਵਰਤੋਂ ਨੂੰ ਸਥਿਰ ਕਰਦਾ ਹੈ ਬਲਕਿ ਬੈਂਚਮਾਰਕਿੰਗ ਸ਼ੁੱਧਤਾ ਵਿੱਚ ਵੀ ਸੁਧਾਰ ਕਰਦਾ ਹੈ। 🛠️ ਇਹਨਾਂ ਕਮੀਆਂ ਤੋਂ ਕਿਵੇਂ ਬਚਣਾ ਹੈ ਅਤੇ ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਕਿ ਤੁਹਾਡੇ ਬੈਂਚਮਾਰਕ ਭਰੋਸੇਯੋਗ ਹਨ, ਇਹ ਜਾਣਨ ਲਈ ਜੁੜੇ ਰਹੋ।
ਹੁਕਮ | ਵਰਤੋਂ ਦੀ ਉਦਾਹਰਨ |
---|---|
@Setup(Level.Iteration) | JMH ਵਿੱਚ ਇਹ ਐਨੋਟੇਸ਼ਨ ਬੈਂਚਮਾਰਕ ਦੇ ਹਰੇਕ ਦੁਹਰਾਓ ਤੋਂ ਪਹਿਲਾਂ ਲਾਗੂ ਕੀਤੇ ਜਾਣ ਲਈ ਇੱਕ ਵਿਧੀ ਨੂੰ ਨਿਸ਼ਚਿਤ ਕਰਦੀ ਹੈ, ਜੋ ਇਸਨੂੰ System.gc() ਨਾਲ ਮੈਮੋਰੀ ਵਰਗੀਆਂ ਸਥਿਤੀਆਂ ਨੂੰ ਰੀਸੈਟ ਕਰਨ ਲਈ ਆਦਰਸ਼ ਬਣਾਉਂਦੀ ਹੈ। |
ProcessBuilder | Java ਵਿੱਚ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਪ੍ਰਕਿਰਿਆਵਾਂ ਨੂੰ ਬਣਾਉਣ ਅਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। ਵੱਖ-ਵੱਖ JVM ਉਦਾਹਰਨਾਂ ਵਿੱਚ ਲਾਂਚ ਕਰਕੇ ਬੈਂਚਮਾਰਕਾਂ ਨੂੰ ਅਲੱਗ ਕਰਨ ਲਈ ਜ਼ਰੂਰੀ ਹੈ। |
System.gc() | ਹੀਪ ਮੈਮੋਰੀ ਇਕੱਠਾ ਕਰਨ ਲਈ ਕੂੜਾ ਇਕੱਠਾ ਕਰਨ ਲਈ ਮਜਬੂਰ ਕਰਦਾ ਹੈ। ਦੁਹਰਾਓ ਦੇ ਵਿਚਕਾਰ ਮੈਮੋਰੀ ਸਥਿਤੀ ਦੇ ਪ੍ਰਬੰਧਨ ਵਿੱਚ ਉਪਯੋਗੀ, ਹਾਲਾਂਕਿ ਇਸਦੀ ਮੰਗ ਦੀ ਗਰੰਟੀ ਨਹੀਂ ਹੈ। |
@Fork(value = 1, warmups = 1) | JMH ਬੈਂਚਮਾਰਕਾਂ ਵਿੱਚ ਫੋਰਕਾਂ (ਸੁਤੰਤਰ JVM ਉਦਾਹਰਨਾਂ) ਅਤੇ ਵਾਰਮਅੱਪ ਦੁਹਰਾਓ ਦੀ ਸੰਖਿਆ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਦਾ ਹੈ। ਮੈਮੋਰੀ ਵਿਵਹਾਰ ਨੂੰ ਅਲੱਗ ਕਰਨ ਲਈ ਮਹੱਤਵਪੂਰਨ. |
Runtime.getRuntime().totalMemory() | JVM ਲਈ ਵਰਤਮਾਨ ਵਿੱਚ ਉਪਲਬਧ ਕੁੱਲ ਮੈਮੋਰੀ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ। ਬੈਂਚਮਾਰਕਿੰਗ ਦੌਰਾਨ ਮੈਮੋਰੀ ਵਰਤੋਂ ਦੇ ਰੁਝਾਨਾਂ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ। |
Runtime.getRuntime().freeMemory() | JVM ਵਿੱਚ ਮੁਫਤ ਮੈਮੋਰੀ ਦੀ ਮਾਤਰਾ ਵਾਪਸ ਕਰਦਾ ਹੈ, ਖਾਸ ਓਪਰੇਸ਼ਨਾਂ ਦੌਰਾਨ ਖਪਤ ਕੀਤੀ ਗਈ ਮੈਮੋਰੀ ਦੀ ਗਣਨਾ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। |
assertTrue() | ਯੂਨਿਟ ਟੈਸਟਾਂ ਵਿੱਚ ਸ਼ਰਤਾਂ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕਰਨ ਲਈ ਇੱਕ JUnit ਵਿਧੀ। ਇੱਥੇ ਦੁਹਰਾਓ ਵਿੱਚ ਇਕਸਾਰ ਮੈਮੋਰੀ ਵਰਤੋਂ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। |
@BenchmarkMode(Mode.Throughput) | ਬੈਂਚਮਾਰਕ ਦੇ ਮੋਡ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ। "ਥਰੂਪੁੱਟ" ਇੱਕ ਨਿਸ਼ਚਤ ਸਮੇਂ ਵਿੱਚ ਪੂਰੇ ਕੀਤੇ ਗਏ ਓਪਰੇਸ਼ਨਾਂ ਦੀ ਸੰਖਿਆ ਨੂੰ ਮਾਪਦਾ ਹੈ, ਜੋ ਕਾਰਗੁਜ਼ਾਰੀ ਪ੍ਰੋਫਾਈਲਿੰਗ ਲਈ ਢੁਕਵਾਂ ਹੈ। |
@Warmup(iterations = 5) | JVM ਨੂੰ ਤਿਆਰ ਕਰਨ ਲਈ ਵਾਰਮਅੱਪ ਦੁਹਰਾਓ ਦੀ ਸੰਖਿਆ ਨੂੰ ਨਿਸ਼ਚਿਤ ਕਰਦਾ ਹੈ। ਮਾਪ ਵਿੱਚ ਸ਼ੋਰ ਨੂੰ ਘਟਾਉਂਦਾ ਹੈ ਪਰ ਮੈਮੋਰੀ ਦੇ ਵਾਧੇ ਦੇ ਮੁੱਦਿਆਂ ਨੂੰ ਉਜਾਗਰ ਕਰ ਸਕਦਾ ਹੈ। |
@Measurement(iterations = 5) | JMH ਬੈਂਚਮਾਰਕਾਂ ਵਿੱਚ ਮਾਪ ਦੁਹਰਾਓ ਦੀ ਸੰਖਿਆ ਨੂੰ ਸੈੱਟ ਕਰਦਾ ਹੈ, ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਸਹੀ ਪ੍ਰਦਰਸ਼ਨ ਮੈਟ੍ਰਿਕਸ ਕੈਪਚਰ ਕੀਤੇ ਗਏ ਹਨ। |
JMH ਵਿੱਚ ਮੈਮੋਰੀ ਇਕੱਠਾ ਕਰਨ ਲਈ ਪ੍ਰਭਾਵੀ ਤਕਨੀਕਾਂ
ਉੱਪਰ ਪ੍ਰਦਾਨ ਕੀਤੀ ਸਕ੍ਰਿਪਟਾਂ ਵਿੱਚੋਂ ਇੱਕ ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ ਪ੍ਰੋਸੈਸ ਬਿਲਡਰ ਜਾਵਾ ਵਿੱਚ ਕਲਾਸ ਬੈਂਚਮਾਰਕਿੰਗ ਲਈ ਵੱਖਰੀ JVM ਪ੍ਰਕਿਰਿਆਵਾਂ ਸ਼ੁਰੂ ਕਰਨ ਲਈ। ਇਹ ਵਿਧੀ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਇੱਕ ਦੁਹਰਾਓ ਦੁਆਰਾ ਵਰਤੀ ਗਈ ਮੈਮੋਰੀ ਅਗਲੀ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਨਹੀਂ ਕਰਦੀ ਹੈ। ਵੱਖ-ਵੱਖ JVM ਉਦਾਹਰਨਾਂ ਵਿੱਚ ਬੈਂਚਮਾਰਕ ਨੂੰ ਅਲੱਗ ਕਰਕੇ, ਤੁਸੀਂ ਹਰੇਕ ਦੁਹਰਾਅ ਲਈ ਹੀਪ ਮੈਮੋਰੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕਰਦੇ ਹੋ। ਪਿਛਲੀਆਂ ਯਾਤਰਾਵਾਂ ਤੋਂ ਯਾਤਰੀਆਂ ਨੂੰ ਲਿਜਾਣ ਵੇਲੇ ਕਾਰ ਦੀ ਈਂਧਨ ਕੁਸ਼ਲਤਾ ਨੂੰ ਮਾਪਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਕਲਪਨਾ ਕਰੋ। ਪ੍ਰੋਸੈਸਬਿਲਡਰ ਹਰ ਵਾਰ ਖਾਲੀ ਕਾਰ ਨਾਲ ਸ਼ੁਰੂ ਕਰਨ ਵਰਗਾ ਕੰਮ ਕਰਦਾ ਹੈ, ਵਧੇਰੇ ਸਹੀ ਰੀਡਿੰਗ ਲਈ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। 🚗
ਇੱਕ ਹੋਰ ਪਹੁੰਚ ਦਾ ਲਾਭ ਉਠਾਉਂਦਾ ਹੈ System.gc() ਕਮਾਂਡ, ਕੂੜਾ ਇਕੱਠਾ ਕਰਨ ਲਈ ਇੱਕ ਵਿਵਾਦਪੂਰਨ ਪਰ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਤਰੀਕਾ ਹੈ। ਇਸ ਕਮਾਂਡ ਨੂੰ ਐਨੋਟੇਟ ਕੀਤੇ ਢੰਗ ਵਿੱਚ ਰੱਖ ਕੇ @Setup(Level.Iteration), JMH ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਹਰੇਕ ਬੈਂਚਮਾਰਕ ਦੁਹਰਾਅ ਤੋਂ ਪਹਿਲਾਂ ਕੂੜਾ ਇਕੱਠਾ ਕੀਤਾ ਜਾਵੇ। ਇਹ ਸੈੱਟਅੱਪ ਪਿਛਲੇ ਕੰਮ ਤੋਂ ਗੜਬੜ ਤੋਂ ਬਚਣ ਲਈ ਕਾਰਜਾਂ ਦੇ ਵਿਚਕਾਰ ਤੁਹਾਡੇ ਵਰਕਸਪੇਸ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਦੇ ਸਮਾਨ ਹੈ। ਜਦੋਂ ਕਿ System.gc() ਤੁਰੰਤ ਕੂੜਾ ਇਕੱਠਾ ਕਰਨ ਦੀ ਗਰੰਟੀ ਨਹੀਂ ਦਿੰਦਾ, ਬੈਂਚਮਾਰਕਿੰਗ ਦ੍ਰਿਸ਼ਾਂ ਵਿੱਚ, ਇਹ ਅਕਸਰ ਮੈਮੋਰੀ ਬਿਲਡ-ਅਪ ਨੂੰ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ, ਸਹੀ ਪ੍ਰਦਰਸ਼ਨ ਮੈਟ੍ਰਿਕਸ ਲਈ ਇੱਕ ਨਿਯੰਤਰਿਤ ਵਾਤਾਵਰਣ ਬਣਾਉਂਦਾ ਹੈ।
ਜਿਵੇਂ ਐਨੋਟੇਸ਼ਨਾਂ ਦੀ ਵਰਤੋਂ @ਫੋਰਕ, @ਗਰਮ ਕਰਨਾ, ਅਤੇ @ਮਾਪ JMH ਸਕ੍ਰਿਪਟਾਂ ਵਿੱਚ ਬੈਂਚਮਾਰਕਿੰਗ ਪ੍ਰਕਿਰਿਆ ਉੱਤੇ ਵਧੀਆ ਨਿਯੰਤਰਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, @Fork(ਮੁੱਲ = 1, ਵਾਰਮਅੱਪ = 1) ਵਾਰਮਅੱਪ ਦੁਹਰਾਅ ਨਾਲ ਇੱਕ ਸਿੰਗਲ ਫੋਰਕ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ। ਇਹ ਸੰਚਤ ਮੈਮੋਰੀ ਮੁੱਦਿਆਂ ਨੂੰ ਰੋਕਦਾ ਹੈ ਜੋ ਮਲਟੀਪਲ ਫੋਰਕਾਂ ਤੋਂ ਪੈਦਾ ਹੋ ਸਕਦੇ ਹਨ। ਵਾਰਮਅੱਪ ਦੁਹਰਾਓ ਅਸਲ ਬੈਂਚਮਾਰਕਿੰਗ ਲਈ JVM ਨੂੰ ਤਿਆਰ ਕਰਦਾ ਹੈ, ਜੋ ਕਿ ਸਰਵੋਤਮ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਕਸਰਤ ਤੋਂ ਪਹਿਲਾਂ ਗਰਮ ਹੋਣ ਦੇ ਬਰਾਬਰ ਹੈ। 🏋️♂️ ਇਹ ਸੰਰਚਨਾਵਾਂ JMH ਨੂੰ ਇਕਸਾਰ ਅਤੇ ਭਰੋਸੇਮੰਦ ਬੈਂਚਮਾਰਕਾਂ ਲਈ ਇੱਕ ਮਜ਼ਬੂਤ ਟੂਲ ਬਣਾਉਂਦੀਆਂ ਹਨ।
ਅੰਤ ਵਿੱਚ, ਯੂਨਿਟ ਟੈਸਟਿੰਗ ਉਦਾਹਰਨ ਦਰਸਾਉਂਦੀ ਹੈ ਕਿ ਮੈਮੋਰੀ ਵਿਵਹਾਰ ਨੂੰ ਕਿਵੇਂ ਪ੍ਰਮਾਣਿਤ ਕਰਨਾ ਹੈ। ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਖਾਸ ਓਪਰੇਸ਼ਨਾਂ ਤੋਂ ਪਹਿਲਾਂ ਅਤੇ ਬਾਅਦ ਵਿੱਚ ਮੈਮੋਰੀ ਵਰਤੋਂ ਦੀ ਤੁਲਨਾ ਕਰਕੇ Runtime.getRuntime(), ਅਸੀਂ ਆਪਣੇ ਕੋਡ ਦੀ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਇਕਸਾਰਤਾ ਅਤੇ ਸਥਿਰਤਾ ਨੂੰ ਯਕੀਨੀ ਬਣਾ ਸਕਦੇ ਹਾਂ। ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਕਿ ਕੋਈ ਅਚਾਨਕ ਖਰਚਾ ਨਾ ਲੱਗੇ, ਖਰੀਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਅਤੇ ਬਾਅਦ ਵਿੱਚ ਆਪਣੇ ਬੈਂਕ ਖਾਤੇ ਦੇ ਬਕਾਏ ਦੀ ਜਾਂਚ ਕਰਨ ਬਾਰੇ ਸੋਚੋ। ਅਜਿਹੀਆਂ ਪ੍ਰਮਾਣਿਕਤਾਵਾਂ ਅਸਮਾਨਤਾਵਾਂ ਦੀ ਛੇਤੀ ਪਛਾਣ ਕਰਨ ਅਤੇ ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਮਹੱਤਵਪੂਰਨ ਹਨ ਕਿ ਤੁਹਾਡੇ ਬੈਂਚਮਾਰਕ ਸਾਰੇ ਵਾਤਾਵਰਣ ਵਿੱਚ ਅਰਥਪੂਰਨ ਹਨ।
JMH ਬੈਂਚਮਾਰਕਸ ਵਿੱਚ ਮੈਮੋਰੀ ਇਕੱਤਰਤਾ ਨੂੰ ਹੱਲ ਕਰਨਾ
ਪਹੁੰਚ 1: ਅਲੱਗ-ਥਲੱਗ ਫੋਰਕਾਂ ਨਾਲ ਜਾਵਾ ਮਾਡਿਊਲਰ ਬੈਂਚਮਾਰਕਿੰਗ
import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@Fork(value = 1, warmups = 1)
@State(Scope.Thread)
public class MemoryBenchmark {
@Benchmark
public int calculate() {
// Simulating a computational task
return (int) Math.pow(2, 16);
}
}
ਉਪ-ਪ੍ਰਕਿਰਿਆ-ਵਰਗੀ ਤਕਨੀਕਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਹਰੇਕ ਦੁਹਰਾਅ ਨੂੰ ਅਲੱਗ ਕਰੋ
ਪਹੁੰਚ 2: ਅਲੱਗ-ਥਲੱਗ ਐਗਜ਼ੀਕਿਊਸ਼ਨ ਲਈ Java ProcessBuilder ਦੀ ਵਰਤੋਂ ਕਰਨਾ
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class IsolatedBenchmark {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "benchmark.jar");
pb.inheritIO();
Process process = pb.start();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
ਦੁਹਰਾਓ ਦੇ ਵਿਚਕਾਰ ਹੀਪ ਮੈਮੋਰੀ ਨੂੰ ਰੀਸੈਟ ਕਰੋ
ਪਹੁੰਚ 3: ਕੂੜਾ ਇਕੱਠਾ ਕਰਨ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ System.gc() ਦਾ ਲਾਭ ਉਠਾਉਣਾ
import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@Fork(1)
@State(Scope.Thread)
public class ResetMemoryBenchmark {
@Setup(Level.Iteration)
public void cleanUp() {
System.gc(); // Force garbage collection
}
@Benchmark
public int compute() {
return (int) Math.sqrt(1024);
}
}
ਇਕਸਾਰਤਾ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕਰਨ ਲਈ ਯੂਨਿਟ ਟੈਸਟ
ਵਾਤਾਵਰਣ ਵਿੱਚ ਮੈਮੋਰੀ ਸਥਿਰਤਾ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class BenchmarkTests {
@Test
void testMemoryUsageConsistency() {
long startMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
int result = (int) Math.pow(2, 10);
long endMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
assertTrue((endMemory - startMemory) < 1024, "Memory usage is inconsistent");
}
}
ਮੈਮੋਰੀ ਗਰੋਥ ਨੂੰ ਸੰਬੋਧਨ ਕਰਨ ਲਈ JMH ਬੈਂਚਮਾਰਕ ਨੂੰ ਅਨੁਕੂਲਿਤ ਕਰਨਾ
JMH ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ ਮੈਮੋਰੀ ਇਕੱਠਾ ਕਰਨਾ ਵਸਤੂ ਧਾਰਨ ਅਤੇ ਕਲਾਸ ਲੋਡਿੰਗ ਦੁਆਰਾ ਵੀ ਪ੍ਰਭਾਵਿਤ ਹੋ ਸਕਦਾ ਹੈ। ਜਦੋਂ JVM ਦੁਹਰਾਓ ਦੌਰਾਨ ਆਬਜੈਕਟ ਬਣਾਉਂਦਾ ਹੈ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹਨਾਂ ਵਸਤੂਆਂ ਦੇ ਹਵਾਲੇ ਤੁਰੰਤ ਕਲੀਅਰ ਨਾ ਕੀਤੇ ਜਾ ਸਕਣ, ਜਿਸ ਨਾਲ ਲਗਾਤਾਰ ਮੈਮੋਰੀ ਵਰਤੋਂ ਹੁੰਦੀ ਹੈ। ਇਸ ਨੂੰ ਵੱਡੇ ਆਬਜੈਕਟ ਗ੍ਰਾਫਾਂ ਜਾਂ ਸਥਿਰ ਖੇਤਰਾਂ ਵਾਲੇ ਦ੍ਰਿਸ਼ਾਂ ਵਿੱਚ ਵਧਾਇਆ ਜਾ ਸਕਦਾ ਹੈ ਜੋ ਅਣਜਾਣੇ ਵਿੱਚ ਹਵਾਲੇ ਰੱਖਦੇ ਹਨ। ਇਸ ਨੂੰ ਘਟਾਉਣ ਲਈ, ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡਾ ਬੈਂਚਮਾਰਕ ਕੋਡ ਬੇਲੋੜੇ ਸਥਿਰ ਸੰਦਰਭਾਂ ਤੋਂ ਬਚਦਾ ਹੈ ਅਤੇ ਜਿੱਥੇ ਉਚਿਤ ਹੋਵੇ ਕਮਜ਼ੋਰ ਸੰਦਰਭਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਅਜਿਹੇ ਅਭਿਆਸ ਕੂੜਾ ਇਕੱਠਾ ਕਰਨ ਵਾਲੇ ਨੂੰ ਅਣਵਰਤੀਆਂ ਵਸਤੂਆਂ ਨੂੰ ਕੁਸ਼ਲਤਾ ਨਾਲ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦੇ ਹਨ। 🔄
ਇੱਕ ਹੋਰ ਅਕਸਰ ਨਜ਼ਰਅੰਦਾਜ਼ ਪਹਿਲੂ ਥਰਿੱਡ-ਸਥਾਨਕ ਵੇਰੀਏਬਲ ਦੀ ਭੂਮਿਕਾ ਹੈ। ਥ੍ਰੈਡਲੋਕਲ ਬੈਂਚਮਾਰਕਾਂ ਵਿੱਚ ਸੌਖਾ ਹੋ ਸਕਦਾ ਹੈ ਪਰ ਜੇਕਰ ਸਹੀ ਢੰਗ ਨਾਲ ਪ੍ਰਬੰਧਿਤ ਨਾ ਕੀਤਾ ਗਿਆ ਹੋਵੇ ਤਾਂ ਮੈਮੋਰੀ ਲੰਮੀ ਹੋ ਸਕਦੀ ਹੈ। ਹਰੇਕ ਥ੍ਰੈਡ ਵੇਰੀਏਬਲ ਦੀ ਆਪਣੀ ਕਾਪੀ ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਦਾ ਹੈ, ਜੋ, ਜੇਕਰ ਸਾਫ਼ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ, ਤਾਂ ਥ੍ਰੈਡ ਦਾ ਜੀਵਨ ਚੱਕਰ ਖਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਵੀ ਕਾਇਮ ਰਹਿ ਸਕਦਾ ਹੈ। ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਸਪੱਸ਼ਟ ਤੌਰ 'ਤੇ ਵੇਰੀਏਬਲਾਂ ਨੂੰ ਹਟਾ ਕੇ ThreadLocal.remove(), ਤੁਸੀਂ ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ ਅਣਇੱਛਤ ਮੈਮੋਰੀ ਧਾਰਨ ਨੂੰ ਘਟਾ ਸਕਦੇ ਹੋ। ਇਹ ਪਹੁੰਚ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਇੱਕ ਦੁਹਰਾਓ ਦੁਆਰਾ ਵਰਤੀ ਗਈ ਮੈਮੋਰੀ ਅਗਲੀ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਖਾਲੀ ਹੋ ਜਾਂਦੀ ਹੈ।
ਅੰਤ ਵਿੱਚ, ਵਿਚਾਰ ਕਰੋ ਕਿ JVM ਕਲਾਸ ਲੋਡਿੰਗ ਨੂੰ ਕਿਵੇਂ ਸੰਭਾਲਦਾ ਹੈ। ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ, ਜੇਐਮਐਚ ਬਾਰ ਬਾਰ ਕਲਾਸਾਂ ਨੂੰ ਲੋਡ ਕਰ ਸਕਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਸਥਾਈ ਪੀੜ੍ਹੀ (ਜਾਂ ਆਧੁਨਿਕ ਜੇਵੀਐਮ ਵਿੱਚ ਮੈਟਾਸਪੇਸ) ਫੁੱਟਪ੍ਰਿੰਟ ਵਧਦਾ ਹੈ। ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ @ਫੋਰਕ ਦੁਹਰਾਓ ਨੂੰ ਅਲੱਗ ਕਰਨ ਜਾਂ ਕਸਟਮ ਕਲਾਸ ਲੋਡਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਐਨੋਟੇਸ਼ਨ ਇਸ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰ ਸਕਦੀ ਹੈ। ਇਹ ਕਦਮ ਹਰੇਕ ਦੁਹਰਾਅ ਲਈ ਇੱਕ ਕਲੀਨਰ ਕਲਾਸ ਲੋਡਿੰਗ ਸੰਦਰਭ ਬਣਾਉਂਦੇ ਹਨ, ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹਨ ਕਿ ਬੈਂਚਮਾਰਕ JVM ਦੇ ਅੰਦਰੂਨੀ ਤੱਤਾਂ ਦੀ ਕਲਾਤਮਕਤਾ ਦੀ ਬਜਾਏ ਰਨਟਾਈਮ ਪ੍ਰਦਰਸ਼ਨ 'ਤੇ ਧਿਆਨ ਕੇਂਦਰਤ ਕਰਦੇ ਹਨ। ਇਹ ਅਭਿਆਸ ਪ੍ਰੋਜੈਕਟਾਂ ਦੇ ਵਿਚਕਾਰ ਇੱਕ ਵਰਕਸਪੇਸ ਨੂੰ ਸਾਫ਼ ਕਰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਇੱਕ ਸਮੇਂ ਵਿੱਚ ਇੱਕ ਕੰਮ 'ਤੇ ਧਿਆਨ ਕੇਂਦਰਿਤ ਕਰ ਸਕਦੇ ਹੋ। 🧹
Memory Accumulation in JMH ਬਾਰੇ ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸਵਾਲ - Frequently asked Questions about Memory Accumulation in JMH
- JMH ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ ਮੈਮੋਰੀ ਇਕੱਠਾ ਹੋਣ ਦਾ ਕੀ ਕਾਰਨ ਹੈ?
- ਯਾਦਦਾਸ਼ਤ ਇਕੱਠਾ ਕਰਨਾ ਅਕਸਰ JVM ਵਿੱਚ ਰੱਖੀਆਂ ਚੀਜ਼ਾਂ, ਅਣ-ਇਕੱਠਾ ਕੂੜਾ, ਜਾਂ ਬਾਰ ਬਾਰ ਕਲਾਸ ਲੋਡਿੰਗ ਤੋਂ ਪੈਦਾ ਹੁੰਦਾ ਹੈ।
- ਮੈਂ ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ ਮੈਮੋਰੀ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਕੂੜਾ ਇਕੱਠਾ ਕਰਨ ਦੀ ਵਰਤੋਂ ਕਿਵੇਂ ਕਰ ਸਕਦਾ ਹਾਂ?
- ਤੁਸੀਂ ਸਪੱਸ਼ਟ ਤੌਰ 'ਤੇ ਕਾਲ ਕਰ ਸਕਦੇ ਹੋ System.gc() ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਦੁਹਰਾਓ ਦੇ ਵਿਚਕਾਰ @Setup(Level.Iteration) JMH ਵਿੱਚ ਐਨੋਟੇਸ਼ਨ
- ਦੀ ਭੂਮਿਕਾ ਕੀ ਹੈ ProcessBuilder ਵੱਖ-ਵੱਖ ਮਾਪਦੰਡਾਂ ਵਿੱਚ ਕਲਾਸ?
- ProcessBuilder ਹਰੇਕ ਬੈਂਚਮਾਰਕ ਲਈ ਨਵੇਂ JVM ਉਦਾਹਰਨਾਂ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਨੂੰ ਅਲੱਗ ਕਰਨ ਅਤੇ ਦੁਹਰਾਓ ਵਿਚਕਾਰ ਧਾਰਨ ਨੂੰ ਰੋਕਣ ਲਈ।
- ਕਿਵੇਂ ਕਰਦਾ ਹੈ @Fork ਐਨੋਟੇਸ਼ਨ ਮੈਮੋਰੀ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਘਟਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਦੀ ਹੈ?
- @Fork ਬੈਂਚਮਾਰਕ ਲਈ JVM ਫੋਰਕਸ ਦੀ ਸੰਖਿਆ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਦਾ ਹੈ, ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਦੁਹਰਾਓ ਇੱਕ ਤਾਜ਼ਾ JVM ਮੈਮੋਰੀ ਸਥਿਤੀ ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ।
- ਕੀ ਥ੍ਰੈਡ-ਸਥਾਨਕ ਵੇਰੀਏਬਲ ਮੈਮੋਰੀ ਧਾਰਨ ਵਿੱਚ ਯੋਗਦਾਨ ਪਾ ਸਕਦੇ ਹਨ?
- ਹਾਂ, ਗਲਤ ਢੰਗ ਨਾਲ ਪ੍ਰਬੰਧਿਤ ThreadLocal ਵੇਰੀਏਬਲ ਮੈਮੋਰੀ ਬਰਕਰਾਰ ਰੱਖ ਸਕਦੇ ਹਨ। ਉਹਨਾਂ ਨੂੰ ਹਮੇਸ਼ਾ ਸਾਫ਼ ਕਰੋ ThreadLocal.remove().
- ਜੇਐਮਐਚ ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ ਸਥਿਰ ਖੇਤਰ ਮੈਮੋਰੀ ਨੂੰ ਕਿਵੇਂ ਪ੍ਰਭਾਵਿਤ ਕਰਦੇ ਹਨ?
- ਸਥਿਰ ਖੇਤਰ ਬੇਲੋੜੀ ਵਸਤੂਆਂ ਦੇ ਹਵਾਲੇ ਰੱਖ ਸਕਦੇ ਹਨ। ਉਹਨਾਂ ਤੋਂ ਬਚੋ ਜਾਂ ਯਾਦਦਾਸ਼ਤ ਨੂੰ ਘੱਟ ਤੋਂ ਘੱਟ ਕਰਨ ਲਈ ਕਮਜ਼ੋਰ ਹਵਾਲਿਆਂ ਦੀ ਵਰਤੋਂ ਕਰੋ।
- ਕੀ ਕਲਾਸ ਲੋਡਿੰਗ ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ ਮੈਮੋਰੀ ਦੇ ਵਾਧੇ ਵਿੱਚ ਇੱਕ ਕਾਰਕ ਹੈ?
- ਹਾਂ, ਬਹੁਤ ਜ਼ਿਆਦਾ ਕਲਾਸ ਲੋਡਿੰਗ ਮੈਟਾਸਪੇਸ ਵਰਤੋਂ ਨੂੰ ਵਧਾ ਸਕਦੀ ਹੈ। ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ @Fork ਜਾਂ ਇੱਕ ਕਸਟਮ ਕਲਾਸ ਲੋਡਰ ਇਸ ਮੁੱਦੇ ਨੂੰ ਘਟਾ ਸਕਦਾ ਹੈ।
- JMH ਦਾ ਵਾਰਮਅੱਪ ਪੜਾਅ ਮੈਮੋਰੀ ਮਾਪਾਂ ਨੂੰ ਕਿਵੇਂ ਪ੍ਰਭਾਵਿਤ ਕਰਦਾ ਹੈ?
- ਵਾਰਮਅੱਪ ਪੜਾਅ JVM ਨੂੰ ਤਿਆਰ ਕਰਦਾ ਹੈ, ਪਰ ਇਹ ਮੈਮੋਰੀ ਮੁੱਦਿਆਂ ਨੂੰ ਵੀ ਉਜਾਗਰ ਕਰ ਸਕਦਾ ਹੈ ਜੇਕਰ ਕੂੜਾ ਇਕੱਠਾ ਕਰਨਾ ਨਾਕਾਫ਼ੀ ਤੌਰ 'ਤੇ ਚਾਲੂ ਹੁੰਦਾ ਹੈ।
- ਮੈਮੋਰੀ ਇਕੱਠੀ ਹੋਣ ਤੋਂ ਬਚਣ ਲਈ ਬੈਂਚਮਾਰਕ ਲਿਖਣ ਲਈ ਸਭ ਤੋਂ ਵਧੀਆ ਅਭਿਆਸ ਕੀ ਹੈ?
- ਸਾਫ਼, ਅਲੱਗ-ਥਲੱਗ ਬੈਂਚਮਾਰਕ ਲਿਖੋ, ਸਥਿਰ ਖੇਤਰਾਂ ਤੋਂ ਬਚੋ, ਅਤੇ ਵਰਤੋਂ @Setup ਦੁਹਰਾਓ ਦੇ ਵਿਚਕਾਰ ਮੈਮੋਰੀ ਸਥਿਤੀ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਦੇ ਤਰੀਕੇ।
- ਕੀ ਮੈਂ ਬੈਂਚਮਾਰਕ ਦੇ ਦੌਰਾਨ ਪ੍ਰੋਗਰਾਮੇਟਿਕ ਤੌਰ 'ਤੇ ਮੈਮੋਰੀ ਵਰਤੋਂ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹਾਂ?
- ਹਾਂ, ਵਰਤੋਂ Runtime.getRuntime().totalMemory() ਅਤੇ Runtime.getRuntime().freeMemory() ਓਪਰੇਸ਼ਨ ਤੋਂ ਪਹਿਲਾਂ ਅਤੇ ਬਾਅਦ ਦੀ ਮੈਮੋਰੀ ਨੂੰ ਮਾਪਣ ਲਈ।
ਭਰੋਸੇਯੋਗ JMH ਬੈਂਚਮਾਰਕਾਂ ਲਈ ਪ੍ਰਭਾਵੀ ਕਦਮ
JMH ਬੈਂਚਮਾਰਕਸ ਵਿੱਚ ਮੈਮੋਰੀ ਇਕੱਤਰਤਾ ਨੂੰ ਸੰਬੋਧਿਤ ਕਰਨ ਲਈ ਇਹ ਸਮਝਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ ਕਿ JVM ਹੀਪ ਮੈਮੋਰੀ ਅਤੇ ਕੂੜਾ ਇਕੱਠਾ ਕਿਵੇਂ ਕਰਦਾ ਹੈ। ਸਧਾਰਣ ਕਦਮ, ਜਿਵੇਂ ਕਿ ਦੁਹਰਾਓ ਨੂੰ ਅਲੱਗ ਕਰਨਾ ਅਤੇ ਮੈਮੋਰੀ ਨੂੰ ਸਪੱਸ਼ਟ ਤੌਰ 'ਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰਨਾ, ਇਕਸਾਰ ਨਤੀਜੇ ਲੈ ਸਕਦੇ ਹਨ। ਇਹ ਤਕਨੀਕਾਂ ਪ੍ਰੋਜੈਕਟਾਂ ਨੂੰ ਲਾਭ ਪਹੁੰਚਾਉਂਦੀਆਂ ਹਨ ਜਿੱਥੇ ਭਰੋਸੇਯੋਗ ਪ੍ਰਦਰਸ਼ਨ ਮਾਪ ਮਹੱਤਵਪੂਰਨ ਹੁੰਦੇ ਹਨ।
ਸਥਿਰ ਸੰਦਰਭਾਂ ਨੂੰ ਘਟਾਉਣਾ ਅਤੇ JMH ਐਨੋਟੇਸ਼ਨਾਂ ਦਾ ਲਾਭ ਉਠਾਉਣ ਵਰਗੇ ਅਭਿਆਸਾਂ ਨੂੰ ਅਪਣਾਉਣਾ ਸਾਫ਼ ਦੁਹਰਾਓ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ। ਡਿਵੈਲਪਰ ਆਮ ਕਮੀਆਂ ਨੂੰ ਘੱਟ ਕਰਦੇ ਹੋਏ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਬਾਰੇ ਸਮਝ ਪ੍ਰਾਪਤ ਕਰਦੇ ਹਨ। ਨਤੀਜੇ ਵਜੋਂ, ਬੈਂਚਮਾਰਕ JVM ਮੈਮੋਰੀ ਵਿਵਹਾਰ ਦੀਆਂ ਕਲਾਤਮਕ ਚੀਜ਼ਾਂ ਦੀ ਬਜਾਏ ਪ੍ਰਦਰਸ਼ਨ 'ਤੇ ਕੇਂਦ੍ਰਿਤ ਰਹਿੰਦੇ ਹਨ। 🎯
JMH ਮੈਮੋਰੀ ਮੁੱਦਿਆਂ ਨੂੰ ਸੰਬੋਧਿਤ ਕਰਨ ਲਈ ਸਰੋਤ ਅਤੇ ਹਵਾਲੇ
- ਜਾਵਾ ਮਾਈਕ੍ਰੋਬੈਂਚਮਾਰਕ ਹਾਰਨੈੱਸ (JMH) ਅਤੇ ਇਸ ਦੀਆਂ ਐਨੋਟੇਸ਼ਨਾਂ ਬਾਰੇ ਵੇਰਵੇ ਅਧਿਕਾਰਤ ਦਸਤਾਵੇਜ਼ਾਂ ਤੋਂ ਲਏ ਗਏ ਸਨ। 'ਤੇ ਹੋਰ ਪੜ੍ਹੋ JMH ਦਸਤਾਵੇਜ਼ .
- ਕੂੜਾ ਇਕੱਠਾ ਕਰਨ ਦੇ ਅਭਿਆਸਾਂ ਅਤੇ System.gc() ਦੀ ਸੂਝ ਦਾ Oracle Java SE ਦਸਤਾਵੇਜ਼ਾਂ ਤੋਂ ਹਵਾਲਾ ਦਿੱਤਾ ਗਿਆ ਸੀ। ਫੇਰੀ Oracle Java SE: System.gc() .
- ਜੇਵੀਐਮ ਮੈਮੋਰੀ ਵਿਵਹਾਰ ਅਤੇ ਬੈਂਚਮਾਰਕਿੰਗ ਵਧੀਆ ਅਭਿਆਸਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਬੇਲਡੰਗ ਦੇ ਲੇਖਾਂ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੀ ਗਈ ਸੀ। 'ਤੇ ਹੋਰ ਜਾਣੋ Baeldung: JVM ਹੀਪ ਮੈਮੋਰੀ .
- Java ਵਿੱਚ ProcessBuilder ਵਰਤੋਂ ਨੂੰ ਅਨੁਕੂਲ ਬਣਾਉਣ ਲਈ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ਾਂ ਨੂੰ Java Code Geeks ਉੱਤੇ ਇੱਕ ਟਿਊਟੋਰਿਅਲ ਤੋਂ ਹਵਾਲਾ ਦਿੱਤਾ ਗਿਆ ਸੀ। 'ਤੇ ਹੋਰ ਪੜਚੋਲ ਕਰੋ ਜਾਵਾ ਕੋਡ ਗੀਕਸ: ਪ੍ਰੋਸੈਸ ਬਿਲਡਰ .