JVM,JDK,JRE和OpenJDK有什么区别?
我是用Java编程的,我遇到了这些短语,它们之间有什么区别?
我想安装一个特定的JDK(例如最新的JDK).为此,我访问了JDK下载主页:http://java.sun.com/javase/downloads/index.jsp.我找了一个Mac版本,但我只是看到Linux,Windows和Solaris的可下载版本有点惊讶......
这是Mac的消息:
"Apple Computer提供他们自己的Java版本.使用Apple Update菜单上的软件更新功能来检查您是否拥有适用于Mac的最新Java版本."
OK但是 ......当我用Mac更新Java时,我有一个JRE而不是JDK ......
我不明白为什么JDK版本不存在易于下载/可安装(如解压缩的jar?)for Mac ...
我一直在使用OpenJDK,最初用于没有问题的小项目.但是自从我开始玩大玩具之后,我开始注意到随机/未知的致命错误和崩溃(使用H.264编解码器等),直到那时才出现系统崩溃和致命错误的噩梦由OpenJDK引起.
在对OpenJDK感到非常沮丧和厌倦之后,我终于决定切换到Oracle JDK 7.从那以后,我的致命错误/崩溃消失了.我仍然在追踪它是否发生,但我从未遇到过那些系统崩溃.
现在我想知道,如果OpenJDK只是一个许可证问题,为什么稳定性不可能呢?
为什么OpenJDK在他们的稳定版本中保留了bug,但是声称它是Oracle JDK的克隆(实际上并不是这样),那么OpenJDK和Oracle JDK在技术上是分开的?(只有快速功能可用性?还是专注于稳定性/可靠性?)
当我在目前的工作中参与 dockerization 项目时,我有一个疑问:我可以使用哪种 java?
这种怀疑是由于:

所以经过一些研究,我得到了这些结论:
根据我的结论:
如果我的开发严格需要或使用JDK 8开发,我是否可以仅将 Oracle Java SE 8 JDK 8u202 及更早版本用于免费和商业目的接受问题和安全问题?
如果我可以改变我的开发并且我仍然想要免费,并且我想要改进和安全更新,我必须使用这些 Java 开放实现之一吗?
本文指出OpenJDK7是Java SE7的官方参考实现.
有人可以确认Java 8的情况也是如此吗?Open JDK8是Java SE8的参考实现吗?
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 是一种本地方法.
这种方法的时间复杂度是多少?
我有点困惑如何下载openjdk8 for windows.
如果我去http://openjdk.java.net/install/然后在JDK 8下只有两个部分:"Debian,Ubuntu等" 和"Fedora,Oracle Linux,Red Hat Enterprise Linux等".窗户在哪里?
亚马逊Corretto和OpenJDK(以及甲骨文的OpenJDK)之间有什么区别- 但是已经有了关于此的门票?Corretto是一个OpenJDK版本8实现.两者都是免费的,似乎可以在大多数系统上运行(Linux,Mac OS和Windows).到目前为止,Corretto仅在预览中,但这将很快改变.Corretto的文档没有说明差异.在性能,垃圾收集方面是否存在差异?为什么我更喜欢一个呢?你会在AWS之外使用Corretto吗?
我安装了JDK8u40,但只找到了javafx-src.zip.
我在哪里可以找到JDK的源代码?src.zip?
以下是安装后的内容:
顺便说一句,我没有看到安装向导!这很奇怪.

今天我尝试了几个Java安装包.所有都是从Oracle官方网站下载的.
双方6u45并7u75在我的箱子装好.我可以看到安装向导.并src.zip安装.
但是8u25〜8u40都安静地安装了.并且没有安装src.zip文件,因为我没有机会在向导中选择它.
我不确定这是我的错,还是Oracle的某个人犯了错误.
正如@SubOptimal所评论的那样,该/s选项表示静默安装.我想知道是否有强制GUI安装向导打开的选项.
我在用 Windows 7 Enterprise x64 Build 7601 SP1
我不确定,但我很确定我在Oracle Java实现中发现了一个错误(或一个未记录的功能)(1.7.0_67和1.8.0_31我可以验证为受影响).
症状
当管道已满时,对管道的写入可能会比管道再次释放所需的时间长一秒.问题的一个最小示例如下(我已将此处显示的示例推送到GitHub上的存储库):
private static void threadA() throws IOException, InterruptedException {
logA("Filling pipe...");
pos.write(new byte[5]);
logA("Pipe full. Writing one more byte...");
pos.write(0);
logA("Done.");
}
private static void threadB() throws IOException, InterruptedException {
logB("Sleeping a bit...");
Thread.sleep(100);
logB("Making space in pipe...");
pis.read();
logB("Done.");
}
Run Code Online (Sandbox Code Playgroud)
pis并pos分别连接PipedInputStream和PipedOutputStream实例.logA并且logB是输出线程名称(A或B)的辅助函数,以毫秒为单位的时间戳和消息.输出如下:
0 A: Filling pipe...
6 B: Sleeping a bit...
7 A: Pipe full. Writing one more byte...
108 B: Making space in …Run Code Online (Sandbox Code Playgroud)