我的旧项目使用Java 6(1.6),我不知道何时更新(Java 7),它们可以正常运行?
所以我在IntelliJ 10.5中打开了一个现有项目作为maven项目.我首先将JDK 7添加到我的SDK列表中以试用这些功能.但是由于某种原因,我的mvn命令会失败,所以我将maven runner切换回1.6.但我得到一个奇怪的错误,其中一些maven命令仍在使用Java 7运行.
在Maven Projects视图中,当我右键单击模块中的生命周期并选择Run Maven Build时,一切正常,但是当我选择Run"clean"时,它仍然使用1.7 JDK.我已从列表中删除了JDK 7,现在我收到一条错误消息,说它无法找到JRE'1.7'.
老实说,我不知道如何解决这个问题,但如果有人有任何建议会很好.
我正在使用Java 7中的转义分析进行一些测试,以便更好地了解哪些对象有资格进行堆栈分配.
这是我编写的用于测试堆栈分配的代码:
import java.util.ArrayList;
import java.util.Iterator;
public class EscapeAnalysis {
private static final long TIME_TO_TEST = 10L * 1000L; // 10s
static class Timestamp {
private long millis;
public Timestamp(long millis) {
this.millis = millis;
}
public long getTime() {
return millis;
}
public void setTime(long time) {
millis = time;
}
}
public static void main(String[] args) {
long r = 0;
System.out.println("test1");
r += test1();
System.out.println("test2");
r += test2();
System.out.println("test3");
r += test3();
System.out.println("test4");
r …Run Code Online (Sandbox Code Playgroud) 如果没有,何时可以预见到?
如果是,您是否知道将现有的Tomcat 7/Java 6安装迁移到Tomcat 7/Java 7是否有特殊之处?
谢谢!
我使用JVM参数在生产环境(rhel 5.2 x64,oracle jre 1.7_05,tomcat 7.0.28)上运行我的应用程序:
-Xms8192m -Xmx8192m -XX:MaxPermSize=1024m
-Doracle.net.tns_admin=/var/ora_net -XX:ReservedCodeCacheSize=512m -XX:+AggressiveOpts -XX:+UseFastAccessorMethods
-XX:+UseStringCache -XX:+OptimizeStringConcat -XX:+UseCompressedOops -XX:+UseG1GC -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9026 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
Run Code Online (Sandbox Code Playgroud)
经过几次,我有像这样的堆栈跟踪:
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to allocate stack guard pages failed.
mmap failed for CEN and END part of zip file
[...]
Caused by: java.lang.OutOfMemoryError: null
at java.util.zip.ZipFile.$$YJP$$open(Native Method) ~[na:1.7.0_05]
at java.util.zip.ZipFile.open(Unknown Source) ~[na:1.7.0_05]
at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05]
at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05]
at …Run Code Online (Sandbox Code Playgroud) 为什么代码替代(1)编译时没有警告,代码替代(2)产生"未经检查的强制转换"警告?
两者共同:
class Foo<T> {
Foo( T [] arg ) {
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(1):
class Bar<T> extends Foo<T> {
protected static final Object [] EMPTY_ARRAY = {};
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(2):
class Bar<T> extends Foo<T> {
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
protected static final Object [] EMPTY_ARRAY = {};
}
Run Code Online (Sandbox Code Playgroud)
备选方案(2)产生:
javac -Xlint:unchecked Foo.java Bar.java
Bar.java:4: warning: [unchecked] unchecked cast
super( (T []) EMPTY_ARRAY );
^
required: T[]
found: …Run Code Online (Sandbox Code Playgroud) 我有t1.micro 64位实例,我按照一些指令(sudo yum install java-1.7.0-openjdk-devel)(sudo yum update等)安装了JDK 7 .所以,当我搜索它时,
sudo yum search openjdk
Run Code Online (Sandbox Code Playgroud)
我得到以下 -
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
Run Code Online (Sandbox Code Playgroud)
所以,两者都安装好了.但是当我尝试使用时切换到JDK 7
sudo update-alternatives --config java
Run Code Online (Sandbox Code Playgroud)
我得到 -
There is 1 program that …Run Code Online (Sandbox Code Playgroud) 我AttachNotSupportedException 在linux(ubuntu 64bit)上运行jmockit测试时得到的.Java版本是1.7.0_51.这个JDK来自Oracle.使用ant运行测试(可能不相关)
查看堆栈跟踪.
[junit]
[junit] java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89)
[junit] at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
[junit] at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
[junit] at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:136)
[junit] at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:169)
[junit] at junit.framework.TestResult.<clinit>(TestResult.java:15)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:356)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1165)
[junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1016)
[junit] Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
[junit] at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
[junit] at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:79)
[junit] ... 8 more
[junit] Exception …Run Code Online (Sandbox Code Playgroud) 对于我的一个项目,我必须对构造函数进行动态调用.但由于这是Java 7,而不是"经典"反射API,我使用java.lang.invoke.
码:
@ParametersAreNonnullByDefault
public class PathMatcherProvider
{
private static final MethodHandles.Lookup LOOKUP
= MethodHandles.publicLookup();
private static final MethodType CONSTRUCTOR_TYPE
= MethodType.methodType(void.class, String.class);
private final Map<String, Class<? extends PathMatcher>> classMap
= new HashMap<>();
private final Map<Class<? extends PathMatcher>, MethodHandle> handleMap
= new HashMap<>();
public PathMatcherProvider()
{
registerPathMatcher("glob", GlobPathMatcher.class);
registerPathMatcher("regex", RegexPathMatcher.class);
}
public final PathMatcher getPathMatcher(final String name, final String arg)
{
Objects.requireNonNull(name);
Objects.requireNonNull(arg);
final Class<? extends PathMatcher> c = classMap.get(name);
if (c == null)
throw new UnsupportedOperationException();
try {
return …Run Code Online (Sandbox Code Playgroud) 我正在通过JNI使用C++库开发一个成像处理Java 7u80应用程序.
由于我愿意与Java 8u60 并行执行流,我刚刚切换到JDK 8并重新启动了我的所有单元测试.
Java 8u60 Overall duration: **35'408 [ms]**
Java 7u80 Overall duration: **29'581 [ms]**
在我看来,Java 7比Java 8快17%(相同的代码,代码级别分别为7和8).
如果不能做任何事情,我宁愿用Java 7而不是8来实现多线程代码,以保持我已经拥有的Java 7性能.