Java 7 컴파일 된 코드를 Java 8로 업그레이드하면 어떤 이점이 있습니까?


127

Java 7을 사용하여 작성된 오래된 응용 프로그램이 있습니다. Java 8 JRE에서 제대로 실행됩니다. Java 8 기능을 사용하기 위해 코드를 다시 작성할 계획은 없습니다. 컴파일 된 코드를 최신 Java 8 JDK로 업그레이드하면 기술적 인 이점이 있습니까?

분명히하기 위해 코드는 현재 Java 7로 컴파일되어 있으며 최신 Java 8 JRE로 이미 실행 중입니다. Java 8 런타임 개선의 이점이 이미 있습니다. 이 질문은 버전 8로 컴파일하고 Java 8 컴파일 된 바이트 코드로 실행하여 이점을 얻을 수 있는지 여부입니다.


또한 개발자 생산성과 같은 비 기술적 이점에 대해서는 걱정하지 않습니다. 나는 이것이 중요하지만이 질문의 요점은 아니라고 생각합니다. 개발 팀이없는 프로덕션 코드를 요구합니다. 순전히 유지 관리 모드입니다.


2
분명해 지려면 이 코드는 이미 최신 1.8 JRE로 실행되므로 모든 최신 Java 8 버그 수정 및 런타임 성능 개선 사항이 있습니다.
g8torPaul

4
이것은 아마도 컴파일러가 바이트 코드를 출력하는 것에 대한 질문 일 것입니다. 아마도 당신의 질문에서 좀 더 명확하게 만들 수 있습니다.
M Platvoet

2
따라서 개발자 생산성 향상이 관련이 없습니까?
Mick Mnemonic

7
"코드를 다시 작성할 계획이 없다"고 어떻게 확신 할 수 없는지 어떻게 알 수 있습니까?
eldo

3
이것은 다소 관련이있을 수 있습니다. stackoverflow.com/questions/21732290/…
Arnaud

답변:


82

질문을 올바르게 이해하면 javacJava 8에서 생성 된 바이트 코드 가 Java 7보다 "더 나은"지 여부를 알고 싶습니다 .

대답은 아마 아닐 것입니다. 컴파일러의 버그를 지속적으로 수정하고 때로는 더 효율적인 바이트 코드로 이어집니다. 그러나 내가 볼 수있는 한 Java 8에 대한 수정 사항으로 인해 속도가 크게 향상되지는 않습니다. 변경 로그 에는 버전간에 2 가지 주요 변경 사항 만 나열됩니다.

오라클 웹 사이트는 끔찍하며 javac버전간에 관련된 버그 수정 목록을 얻을 수없는 것 같지만 OpenJDK의 철저하지는 않습니다 . 내가 찾을 수있는 대부분은 오류를 수정하는 것입니다. 따라서 Java 8로 업데이트 javac하면 JLS 를 더 정확하게 따르기 때문에 더 이상 컴파일되지 않을 가능성 이 있으며 바이트 코드에 대한 "개선"이 거의 없습니다.


4
고마워, OpenJDK에 대한 목록 중 일부를 검토했으며 javac의 성능이 향상되었다는 것을 제외하고는 실제로 눈에 띄는 것은 없습니다. Oracle 웹 사이트의 Java 버전간에 적절한 수정 / 기능을 검색하는 것이 불가능하다는 데 동의합니다. 각 버전의 릴리스 노트 형식은 일관성이 없습니다. 내 창자는 JDK 7 대 JDK 8로 컴파일에 대한 기술적 인 이점이 없다는 것을 알려줍니다
g8torPaul

1
@ g8torPaul Java 8에서만 제공되는 기능 (예 : lamdbas / streams)을 사용하지 않는 한
Peter Lawrey

21

주요 이점은 Java 8에 Java 7이 공개적으로 업데이트되지 않는 최신 버그 수정이 있다는 것입니다.

또한 Java 8 JVM에서 코드를 실행하려는 경우 Java 버전이 하나만 설치되어있을 수도 있습니다.

Java 8이 더 빠를 수 있으며 G1과 같은 새로운 기능을 더 잘 지원합니다. 그러나 유스 케이스의 경우 속도가 느려질 수 있으므로 테스트하는 것이 유일한 방법입니다.

컴파일 된 코드를 최신 Java 8 JDK로 업그레이드하면 기술적 인 이점이 있습니까?

Java 8 컴파일러에서 Java 7 코드를 다시 컴파일 할 때 어떤 이점이 있는지 묻는다면 그 대답이 있습니다. 거의 아무것도.

유일한 미묘한 차이점은 Java API에 약간의 차이가 있다는 것입니다. 따라서 Java 8 컴파일러가 Java 7에서 발견 할 수있는 미묘한 차이점이있을 수 있습니다

다른 사소한 차이점은 파일 시작시의 마법 번호, 아마도 상수 풀의 순서입니다. 바이트 코드는 기본적으로 동일 invokedynamic합니다. 람다에 대한 추가 지원조차도 Java 7에 존재했지만 그렇게 사용되지 않았습니다.


8
내가 틀렸다면 정정하지만 OP는 Java 8로 코드를 다시 컴파일하는 것에 대해 묻지 만 Java 8을 사용하여 코드를 실행할지에 대한 대답은 무엇입니까?
tobias_k

5
현재 최신 Java 1.8 JRE에서 실행 중입니다. 모든 버그 수정 및 내부 Java 코드는 JRE에서 제공합니다. 나는 이것이 내 질문을 다루지 않는다고 생각한다.
g8torPaul

16
이것은 단순히 질문에 대답하지 않습니다. "거의 없음"인 경우 차이점이 무엇인지 명확히하십시오. 그렇지 않으면 그냥 추측입니다
M Platvoet

1
@Peter Lawrey, 당신은 ".. 대답은 거의 없다"고 말합니다. 이를 뒷받침 할 증거가 있습니까? BTW, 나는 당신에게 동의하는 경향이 있습니다.
g8torPaul

2
@ g8torPaul Java 8은 Java 7과 호환되도록 설계되었으며 Java 8의 기능을 사용하지 않는 경우 거의 동일한 바이트 코드를 생성해야합니다.
피터 로리

21

인식 을 만들어 도움을 줄 수 있습니다.

Java8로 전환하면 javac에서 추가 경고가 표시 될 수 있습니다. 예 : Java8에서는 형식 유추 가 크게 향상되었습니다. 따라서 현재 코드베이스에서 @SuppressWarnings 주석이 필요하지 않을 수 있습니다 (이러한 주석이 더 이상 필요하지 않으면 컴파일러가 경고합니다).

따라서 오늘날 코드베이스를 수정하지 않더라도 Java8로 전환하면 그러한 정보를 알 수 있습니다. 지식을 늘리면 정보에 입각 한 결정을 내리는 데 도움이 될 수 있습니다.

반면에 :

  • Java8이 Java7 코드 컴파일을 거부 한 (드문) 상황에 대한 몇 가지 질문이 있습니다. 따라서 Java8로 전환하면 이러한 종류의 문제가 발생할 위험이 최소화됩니다.
  • 그리고 오늘 코드 기반을 건드리지 않으려는 경우에도 나중에 마음이 바뀔 가능성이 있습니다. 그런 다음주의를 기울이지 않으면 Java8 기능을 이용할 수 있습니다. 어떤 "필드 업데이트"를 복잡하게; 당신은 지금 가지고있는 두 개의 유지하기 위해 소스 코드의 버전을!
  • 그런 다음 : java7 jre를 사용하여 제품을 실행하는 고객이있는 경우; 당신이 그들에게 제공하는 바이너리 픽스에 대해 정말로 조심해야한다. 우리는 그러한 설정을 가지고 있습니다. 실수로 단일 Java8 컴파일 클래스를 Java7 기반 테스트 시스템에 배치했기 때문에 시간이 두 번 이상 낭비되었습니다. 개발자 및 테스트 / 고객 설정이 모두 Java7 인 경우에는 간단하게 발생할 수 없습니다.

간단히 말해 : 몇 가지 미묘한 장점과 특정 위험 (위험의 중요성이 주로 전체 설정에 달려 있음)이 있습니다.


2
드문 "Java8이 Java7 컴파일을 거부했습니다"문제의 한 예 : stackoverflow.com/q/41590024/2513200 (Oracle Compiler의 알려진 문제는 Java 8에만 영향을 주지만 7 또는 9에는 영향을 미치지 않음)
Hulk

8

나는 적어도 이러한 사실을 위해 할 것입니다 .

1) HashMap 내부 (jdk-8에서는 더 빠름)

2) 수정 된 버그 많은 당신이 실제로 아무것도하지 않고 빠르고 더 나은 코드를 만들 것 (런타임 최적화를위한 투명).

3) G1 가비지 콜렉터

편집하다

기술적 인 관점에서 이것은 Ahead of Time Compilation과 관련이 있거나 코드를 더 분석하여 컴파일러가 개선 할 수있는 것과 비슷합니다 . 내가 아는 한 그러한 것은 Java 8 컴파일러에서 수행되지 않습니다.

개발자의 관점에서 볼 때 많은 것이 있습니다. 생산성 향상이 가장 중요합니다.

편집 2

두 번째 쿼리와 일치하는 두 가지 점만 알고 있습니다.

– 매개 변수

메소드 매개 변수 이름을 보존합니다.

-프로필

더 작은 설치 공간을 위해 컴팩트 프로파일 옵션 이라고합니다 .


26
Java 8 에서만 실행 하면 이미 이러한 이점이 제공되지 않습니까? 실제 질문은 "Java 7보다 Java 7보다 잘 작동하는 것을 작성할 수 있습니까?"입니다.
Jorn Vernee

8
현재 최신 Java 1.8 JRE에서 실행 중입니다. 모든 버그 수정 및 내부 Java 코드는 JRE에서 제공합니다. 가비지 콜렉터도 JRE의 일부입니다. 나는 이것이 내 질문을 다루지 않는다고 생각한다.
g8torPaul

8
@JornVernee OPs는 명시 적으로 아무 것도 다시 작성하고 싶지 않다고 말했기 때문에 질문은 "Java 8 컴파일러가 Java 7 컴파일러가 할 수없는 트릭을 수행 할 수
있습니까?

2
@JornVernee 문제는 Java 7로 작성되고 Java 8로 컴파일 된 코드가 Java 7로 컴파일 된 코드보다 잘 실행된다면
EarlGrey

6
질문에 대답하지 않고 단지 개선되지 않았다고 추측합니다.
M Platvoet

-1

응용 프로그램을 다시 컴파일 해야하는 다른 이유가 없다면 허용 된 답변에 명시된 것처럼 큰 차이가 없을 것입니다.

그러나 한 번만 다시 컴파일해야하는 경우 다음을 고려하십시오.

  • 애플리케이션 소스 코드는 Java 7과 호환되며 대부분 8 과도 호환됩니다.
  • 코드가 Java 8로 컴파일되지 않는 경우 Java 7 소스 호환 모드 ( -source 7javac 사용) 에서 Java 8 컴파일러로 컴파일되지 않을 것입니다 .
  • 개발자와 CI는 가능한 한 프로덕션 환경에 가깝도록 Java 8 런타임에 대해 단위 및 통합 테스트를 실행해야합니다. 개발자는 응용 프로그램을 로컬로 실행할 때 동일한 Java 8 런타임에서 응용 프로그램을 실행해야합니다.
  • 동일한 버전으로 모든 것을 수행하는 것보다 JDK 7로 컴파일하고 JRE 8 (동일한 빌드 프로세스 또는 동일한 IDE에서)로 실행하는 것이 더 어렵습니다.
  • JDK 8로 컴파일하고 대상 런타임이 Java 8 -source 7-source 8경우 대신 사용 하면 이점이 없습니다 .
  • 를 사용 -source 8하면 개발자가 컴파일 및 런타임 모두에 Java 8 이상을 사용하고 있음을 보장 할 수 있습니다 (강제로 -target 8).

결론적으로, 필요하지 않으면 다시 컴파일하지 마십시오. 그러나 처음에는 코드 변경으로 인해 다시 컴파일해야하고 Java 8로 전환해야합니다. 환경 불일치로 인해 버그가 발생할 위험을 감수하지 말고 적절한 이유없이 개발자를 제한하지 마십시오.


두 번째 글 머리 기호가 올바르지 않습니다. 귀하의 게시물은 몇 가지 점에서 모순됩니다.
Lorne의 후작

@EJP 두 번째 글 머리 기호는 내 경험에 가깝지만 JDK 8에서 컴파일 -source 7하지만 컴파일하지 않는 예제 가 -source 8있습니까? 또한 귀하의 의견이 그다지 건설적이지 않기 때문에 모순
Didier L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.