是否有一个命令行工具,最好是在JDK中,要么在类文件中打印所有注释,要么将特定注释作为参数进行打印?
如果是这样,是否有一个等效命令可以在jar文件上运行,包含在其中的特定类?
我用谷歌搜索了一段时间,没有运气.:(
我知道Java中volatile变量的目的是对其他线程立即可以看到对这些变量的写入.我也知道同步块的一个影响是将线程本地内存刷新到全局内存.
在这种情况下,我从未完全理解对"线程本地"内存的引用.我理解只存在于堆栈上的数据是线程本地的,但是当谈论堆上的对象时,我的理解变得模糊.
我希望能得到以下几点的评论:
在具有多个处理器的计算机上执行时,是否刷新线程本地内存只是将CPU缓存刷新到RAM中?
在单处理器机器上执行时,这是否意味着什么?
如果堆可能在两个不同的内存位置(每个由不同的线程访问)具有相同的变量,那么在什么情况下会出现这种情况?这对垃圾收集有什么影响?虚拟机如何积极地做这种事情?
(编辑:添加问题4)退出同步块时刷新了什么数据?它是本地线程的一切吗?它只是在同步块内写的吗?
Object x = goGetXFromHeap(); // x.f is 1 here
Object y = goGetYFromHeap(); // y.f is 11 here
Object z = goGetZFromHead(); // z.f is 111 here
y.f = 12;
synchronized(x)
{
x.f = 2;
z.f = 112;
}
// will only x be flushed on exit of the block?
// will the update to y get flushed?
// will the update to z get flushed?
Run Code Online (Sandbox Code Playgroud)总的来说,我想要了解线程局部是否意味着只有一个CPU可以物理访问的内存,或者VM是否存在逻辑线程局部堆分区?
任何演示文稿或文档的链接都会非常有用.我花时间研究这个,虽然我找到了很多不错的文献,但我还是无法满足我对线程局部记忆的不同情况和定义的好奇心.
非常感谢.
public void wahey(List<Object> list) {}
wahey(new LinkedList<Number>());
Run Code Online (Sandbox Code Playgroud)
对方法的调用不会进行类型检查.我甚至无法将参数强制转换如下:
wahey((List<Object>) new LinkedList<Number>());
Run Code Online (Sandbox Code Playgroud)
根据我的研究,我收集到不允许这样做的原因是类型安全.如果允许我们执行上述操作,那么我们可以执行以下操作:
List<Double> ld;
wahey(ld);
Run Code Online (Sandbox Code Playgroud)
在方法wahey中,我们可以在输入列表中添加一些字符串(因为参数维护List<Object>引用).现在,在方法调用之后,ld引用一个带有类型的列表List<Double>,但实际列表包含一些String对象!
这似乎与没有泛型的Java正常工作方式不同.例如:
Object o;
Double d;
String s;
o = s;
d = (Double) o;
Run Code Online (Sandbox Code Playgroud)
我们在这里做的基本上是相同的,除了这将通过编译时检查,并且只在运行时失败.带有列表的版本将无法编译.
这让我相信这纯粹是关于泛型类型限制的设计决策.我希望对这个决定有所评论?
将IDE(IntelliJ或Eclipse)中的调试器连接到在另一个大陆(伦敦到纽约)运行的JVM时,滞后是无法忍受的.我等了超过10分钟,IntelliJ填充我的堆栈并填写对象,然后在遇到断点时放弃.(注意:在执行此操作时,我从未见过完全填充的调试状态!)这使得无法使用IDE进行远程调试!
我知道jdb工具,它没有遇到任何这样的滞后问题.我想是因为它更精细地调整来自VM的特定数据检索,而不是填充每个堆栈帧和所有可访问的值.
有人知道是否有中间立场?我发现使用jdb很麻烦 - 我很想看到一个没有遇到IDE滞后问题的UI(在jdb上构建).有谁知道这样的申请是否存在?
有没有人知道调试远在千里之外的远程虚拟机的其他技术?
import java.util.Collection;
public class Test
{
public static void main(String[] args)
{
Collection c = null;
Test s = null;
s = (Test) c;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码示例中,我将一个集合对象转换为Test对象.(忽略空指针).Test 与Collection 无关,但该程序将通过所有编译时检查.
我想知道为什么会这样.我的假设是接口被忽略,因为它们太复杂了.它们没有通用的超类型,每个类都可以实现多个接口,因此类/接口层次结构太复杂而无法有效搜索?
除此之外,我很难过.有人知道吗?!
我无法在任何给定时间运行多个java webstart实例.
例如,我无法同时运行应用程序的生产和QA实例,这两个实例都是通过java webstart启动的.此外,我无法与我的应用程序的生产或QA实例同时运行java webstart缓存查看器.
我很但是能够运行,当他们在彼此隔离运行任何上述三个Webstart的启动的.当我尝试提出第二个选项时,我看到"Java Loading ..."屏幕然后消失,没有任何反应.
另外,我试图删除webstart缓存(通过java webstart缓存查看器),无论我指向哪个JRE,我都会收到以下错误:
"安装错误.调用Java VM(execv)时出错"javaw.exe的路径'"
我希望上面提到的两个问题都是相互关联的.我不相信我最近改变了任何配置,我很高兴运行java webstart多年.
有没有人见过这样的问题?
谢谢,杰克
编辑:当第二个webstart实例尝试运行时,在显示"Java Loading ..."屏幕期间,我可以在任务管理器中看到生成了一个新的javaw.exe进程.这个过程几乎立刻就死了.我不确定如何检查该过程中的失败,但我希望它类似于尝试通过webstart缓存查看器清除缓存时的失败.
java ×6
annotations ×1
casting ×1
class ×1
command-line ×1
covariance ×1
debugging ×1
downcast ×1
generics ×1
interface ×1
jar ×1
jdb ×1
jnlp ×1
memory ×1
model ×1