我试图捕获Java应用程序中出现的完整GCs。到目前为止,我有两种方法,都有缺陷:
编辑:为了明确起见,我想在给定的JVM中捕获这些信息。这个JVM由一个单独的团队控制,我们不需要控制他们将设置的JVM参数,我们只能提出建议。这个想法类似于飞行记录器,而是向管理员实时提供信息。
您可以侦听GC通知。请参见下面的代码。
我在这里交叉了这个答案,因为它似乎相关。根据@the8472在这个问题中给出的指针,我制作了一个更完整的示例,用于从JVM内部记录GC(从而检测/计数)。我希望这能为某人节省一些时间:)
package fi.pelam.gclogutil;
import java.lang.management.*;
import java.util.Map;
import javax.management.openmbean.CompositeData;
import javax.management.*;
import com.sun.management.GarbageCollectionNotificationInfo;
import com.sun.management.GcInfo;
public class GcLogUtil {
static public void startLoggingGc() {
// http://www.programcreek.com/java-api-examples/index.php?class=javax.management.MBeanServerConnection&method=addNotificationListener
// https://docs.oracle.com/javase/8/docs/jre/api/management/extension/com/sun/management/GarbageCollectionNotificationInfo.html#GARBAGE_COLLECTION_NOTIFICATION
for (GarbageCollectorMXBean gcMbean : ManagementFactory.getGarbageCollectorMXBeans()) {
try {
ManagementFactory.getPlatformMBeanServer().
addNotificationListener(gcMbean.getObjectName(), listener, null,null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
static private NotificationListener listener = new NotificationListener() {
@Override
public void handleNotification(Notification notification, Object handback) {
if (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) {
// https://docs.oracle.com/javase/8/docs/jre/api/management/extension/com/sun/management/GarbageCollectionNotificationInfo.html
CompositeData cd = (CompositeData) notification.getUserData();
GarbageCollectionNotificationInfo gcNotificationInfo = GarbageCollectionNotificationInfo.from(cd);
GcInfo gcInfo = gcNotificationInfo.getGcInfo();
System.out.println("GarbageCollection: "+
gcNotificationInfo.getGcAction() + " " +
gcNotificationInfo.getGcName() +
" duration: " + gcInfo.getDuration() + "ms" +
" used: " + sumUsedMb(gcInfo.getMemoryUsageBeforeGc()) + "MB" +
" -> " + sumUsedMb(gcInfo.getMemoryUsageAfterGc()) + "MB");
}
}
};
static private long sumUsedMb(Map<String, MemoryUsage> memUsages) {
long sum = 0;
for (MemoryUsage memoryUsage : memUsages.values()) {
sum += memoryUsage.getUsed();
}
return sum / (1024 * 1024);
}
}
我正在尝试寻找资源或库,可以让我捕捉所有网络数据包的流量的设备编程,无论是从wifi或移动网络。我相信不需要root用户就可以像shark for root用户所要求的那样进入这种混乱的模式,因为play store上有一个应用程序,它可以捕获所有的网络流量(甚至用MITM解密SSL),而不需要root用户。我根本想不出如何做同样的事。 我的问题是:这款app是如何实现这种抓取的?他们用了什么AP
问题内容: 我试图避免Full GC(来自下面的gc.log示例)在生产中的Tomcat中运行Grails应用程序。关于如何更好地配置GC的任何建议? 14359.317:[完整GC 14359.317:[CMS:3453285K- > 3099828K(4194304K),13.1778420秒] 4506618K-> 3099828K(6081792K),[CMS彼尔姆:261951K-> 1
如何从android SDK以编程方式访问KNOX计数器? 我想让我的应用程序检查值,以尝试并确定它是否运行在已扎根的三星手机上。
问题内容: 如何从包含证书和私钥的PEM文件中以编程方式获取KeyStore?我试图在HTTPS连接中向服务器提供客户端证书。我已经确认,如果我使用openssl和keytool来获取jks文件(该文件是动态加载的),则客户端证书可以使用。我什至可以通过动态读取p12(PKCS12)文件来使其工作。 我正在考虑使用BouncyCastle的PEMReader类,但无法克服一些错误。我正在使用-Dj
问题内容: 我正在编写一个报告本地计算机上网络设备属性的应用程序。我需要mac地址,mtu,链接速度和其他一些信息。我为此使用udev。我已经弄清楚了如何获取mac地址和mtu,但还没有弄清楚链接速度。我可以从终端使用ethtool来获取它,但是我需要一种以编程方式获取它的方法。 有谁知道我如何获得udev或其他库的链接速度属性? 问题答案: 您需要使用ioctl()调用。在LinuxJourna
我有一个基于linux操作系统的自定义嵌入式系统。有摄像头连接到我的系统,我想使用谷歌驱动器作为云存储记录从我的摄像头。 3-然后我使用浏览器访问url,键入授权代码并允许手动身份验证。然后通过另一个HTTP请求获得access_token和refresh_token。 4-之后,我可以成功地使用给定access_token的任何api函数。(如果它过期,我会使用refresh_token刷新它)