Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save barlog-m/75834f672fd6a44107c8 to your computer and use it in GitHub Desktop.
Save barlog-m/75834f672fd6a44107c8 to your computer and use it in GitHub Desktop.
JVM Resource Management Traffic Measurement Example
package li.barlog;
import jdk.management.resource.ResourceContext;
import jdk.management.resource.ResourceContextFactory;
import jdk.management.resource.ResourceType;
import jdk.management.resource.SimpleMeter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.function.Function;
/*
available since 8u40
JVM Options for run: -XX:+UnlockCommercialFeatures -XX:+ResourceManagement
http://docs.oracle.com/javase/8/docs/jre/api/management/rm/jdk/management/resource/package-summary.html
http://www.youtube.com/watch?v=0WZpmylHbFM
*/
public final class App {
private static final Logger log = LoggerFactory.getLogger(App.class);
private static int TIMEOUT = 1000;
public static void main(String... args) {
measure(ping, "http://ya.ru");
measure(ping, "https://ya.ru");
measure(ping, "http://google.com");
measure(ping, "https://google.com");
}
private static final Function<String, Boolean> ping = url -> {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setConnectTimeout(TIMEOUT);
connection.setReadTimeout(TIMEOUT);
connection.setRequestMethod("GET");
//connection.setRequestMethod("HEAD");
log.info("URL: {}", url);
log.debug("Code: {}, Message: {}",
connection.getResponseCode(),
connection.getResponseMessage());
int responseCode = connection.getResponseCode();
return (200 <= responseCode && responseCode <= 399);
} catch (IOException e) {
log.error("{}", e.getMessage(), e);
return false;
}
};
private static void measure(Function<String, Boolean> fn, String url) {
ResourceContextFactory factory = ResourceContextFactory.getInstance();
try (ResourceContext rc = factory.create("rc")) {
SimpleMeter open = SimpleMeter.create(ResourceType.SOCKET_OPEN);
rc.addResourceMeter(open);
SimpleMeter in = SimpleMeter.create(ResourceType.SOCKET_READ);
rc.addResourceMeter(in);
SimpleMeter out = SimpleMeter.create(ResourceType.SOCKET_WRITE);
rc.addResourceMeter(out);
rc.bindThreadContext();
log.info("Result: {}", fn.apply(url));
log.info("Open: {}, In: {}, Out: {}",open.getAllocated(), in.getAllocated(), out.getAllocated());
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment