我正在尝试使用代理“注入”一个 jar,现在 Java 版本都是 1.8,并且工具来自我的 JDK lib 文件夹,所以我认为这也没有任何问题
这是我的加载类
public static void main(final String[] args) throws Exception {
final File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
System.out.println("Starting Lizard...");
try {
Class.forName("com.sun.tools.attach.VirtualMachine");
}
catch (ClassNotFoundException e2) {
System.out.println("ERROR: Couldn't load VirtualMachine class, is tools.jar present?");
return;
}
System.out.println("Loading attach library...");
extractLibrary(jarFile);
try {
System.loadLibrary("attach");
}
catch (Exception e3) {
System.out.println("ERROR: Couldn't load attach libary!");
return;
}
System.out.println("Attach library loaded.");
System.out.println("Searching for Minecraft JVM...");
for (final VirtualMachineDescriptor descriptor : VirtualMachine.list()) {
if (descriptor.displayName().startsWith("net.minecraft.launchwrapper.Launch")) { …Run Code Online (Sandbox Code Playgroud) 所以Java的调试接口是使用JVMTI作为后端的....但是JVMTI需要在目标架构上编译,那么这些JDI使用的JVMTI函数是不是预先编译好并作为库随JDK一起提供的呢?这意味着我可以在不使用 JDI 的情况下使用那些预编译库……是吗?我假设只有少数函数已经编译,但如果我需要这些函数,那么我不需要自己编译它们的麻烦......
在Java 6 HotSpot VM上,以下哪一项更优化?
final Map<Foo,Bar> map = new HashMap<Foo,Bar>(someNotSoLargeNumber);
for (int i = 0; i < someLargeNumber; i++)
{
doSomethingWithMap(map);
map.clear();
}
Run Code Online (Sandbox Code Playgroud)
要么
final int someNotSoLargeNumber = ...;
for (int i = 0; i < someLargeNumber; i++)
{
final Map<Foo,Bar> map = new HashMap<Foo,Bar>(someNotSoLargeNumber);
doSomethingWithMap(map);
}
Run Code Online (Sandbox Code Playgroud)
我认为他们对意图都很清楚,所以我不认为风格/增加复杂性是一个问题.
直觉看起来第一个会更好,因为只有一个'新'.但是,如果不保留对地图的引用,HotSpot是否能够确定为每个循环创建相同大小的映射(内部为Entry [someNotSoLargeNumber]),然后使用相同的内存块(即不做了很多内存分配,只是将调零比调用每个循环的clear()更快?
一个可接受的答案是指向文档的链接,该文档描述了HotSpot VM实际可以实现的不同类型的优化,以及如何编写代码来协助HotSpot(而不是手动优化代码的天真魅力).
他们使用像Mono的PInvoke这样的东西吗?或者更像是在运行时启动之前注册的内部调用?java有一个基本库来处理像mscorlib.dll这样的本机调用吗?如果我想在C代码中调用JVM,它库是否会查找.so/.dll文件?如果我静态链接所有JRE本机库,它会对Java标准库产生影响吗?
我正在调试expr1 & expr2其中expr1具有影响expr2评估结果的副作用的代码.我怀疑expr2之前会进行评估expr1,因为JLS保证从左到右的评估&&,但不一定是&.我还怀疑评估顺序的更改可能是HotSpot执行优化的结果(我们正在运行Java 6u20).你知道HotSpot能否进行这样的优化吗?更好的是,提供支持或消除怀疑的文档的任何指针.提前致谢.
编辑:感谢那些建议重写代码,因为它既正确又可读 - 你是对的,但我已经做了,所以这不是我想要的.不幸的是,很难测试这个变化,这就是我在这里提出问题的原因.
scala的actor模型如何利用C线程和本机系统线程?我知道编译器是可插入的,所以scala编译器取代了java编译器.我对下一步感到困惑,不是代码的中间表示只是被热点优化(可能不如基于线程的模型有效)并且转换为基于线程的机器代码和C的组合.
我正在使用-XX:+PrintGCApplicationStoppedTime和-XX:+PrintGCApplicationConcurrentTime选项打开gc日志记录.
但发现只有PrintGCApplicationStoppedTime经过-XX:+PrintGCDetails命令打印的gc日志的4 0r 5打印后我的实际细节!
根据定义,PrintGCApplicationStoppedTime打印应用程序停止每个gc的时间.
但我不清楚为什么它打印如下所示的例子.
是因为
PrintGCApplicationStoppedTime 只需在每个安全点到达后打印
(要么)
日志文件将由不同的gc线程记录.我使用Concurrent扫描完整的GC和年轻一代的ParNew
我的应用是web应用程序.
O/p模式 - 我是这样的:
Application time: 0.3847031 seconds
Total time for which application threads were stopped: 0.3135419 seconds
Application time: 0.1520723 seconds
Total time for which application threads were stopped: 0.1993920 seconds
Application time: 0.1188219 seconds
Total time for which application threads were stopped: 0.1993920 seconds
Application time: 0.1188219 seconds
Total time for which application threads were stopped: 0.1993920 …Run Code Online (Sandbox Code Playgroud) 我能够ObjectHeap.iterateObjectsOfKlass(在SA的帮助下)调用以获取属于某个类的所有对象.结果正是我所期望的,但性能却不是.
我花了800秒才得到我的结果,在此期间目标虚拟机被暂停.目标VM堆大约为2GB.我知道iterateObjectsOfKlass会打电话iterateExact.
我的问题是:这些方法迭代/遍历整个堆只是为了获得1个类的对象吗?我很失望,因为我的期望是单一课程,结果应该在10秒内返回.
我正在尝试从工作站监视VisualGC。
命令: java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)
因此,我创建了一个策略文件,并尝试启动jstatd,如下所示。
文件名: jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)
尝试执行的命令: jstatd -J-Djava.security.policy = jstatd.all.policy
错误: -bash:jstatd:找不到命令
命令: rpm -qa | grep java
输出:
tzdata-java-2017c-1.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.151-5.b12.el7_4.x86_64
java-1.8.0-openjdk-1.8.0.151-5.b12.el7_4.x86_64
python-javapackages-3.4.1-11.el7.noarch
Run Code Online (Sandbox Code Playgroud)
另外,在visualvm的“选项卡:Visual GC”上,我看到“此JVM不支持”
问题是我们可以缓存jclass并jmethodID跨不同的JNI方法调用吗?
尝试通过缓存jclass和jmethodID其他JNI方法调用创建某个特定类的对象时,遇到了一些奇怪的行为。
这是一个简单的示例:
public class Main {
static {
System.loadLibrary("test-crash");
}
public static void main(String args[]) throws InterruptedException {
Thread.sleep(20000);
doAnotherAction(doSomeAction());
}
private static native long doSomeAction();
private static native void doAnotherAction(long ptr);
}
public class MyClass {
public int a;
public MyClass(int a) {
if(a == 10){
throw new IllegalArgumentException("a == 10");
}
this.a = a;
}
}
Run Code Online (Sandbox Code Playgroud)
JNI函数所做的只是创建类的对象MyClass。该函数doSomeAction返回一个指向已缓存的jclass和的指针jmethodID。这是本机方法的实现:
struct test{
jclass mc; …Run Code Online (Sandbox Code Playgroud) java ×10
jvm-hotspot ×10
jvm ×7
heap ×1
jdi ×1
jvmti ×1
optimization ×1
performance ×1
scala ×1
verbosegc ×1