JavaRush /Java блогы /Random-KK /8-ден 13-ке дейін: Java нұсқаларына толық шолу. 2-бөлім
Константин
Деңгей

8-ден 13-ке дейін: Java нұсқаларына толық шолу. 2-бөлім

Топта жарияланған
Бұл мақала менің Java 8-13 нұсқаларындағы инновацияларға шолуымның екінші бөлігі. Бірінші бөлім осында . Әрі қарай жалғастырамыз: 2018 жылдың 25 қыркүйегіне дейін, жаңа JDK шыққан кезде:

Java 11

8-ден 13-ке дейін: Java нұсқаларына толық шолу.  2 - 1 бөлім

var (лямбда тілінде)

Бұдан былай лямбда параметрлерінің түрлерін көрсетуге немесе ламбда өрнегін жазу кезінде оларды өткізіп жіберуге болады (жасырын терілген ламбда өрнектері):
Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Сондай-ақ, толық айнымалы түр атауын жазбастан lambda параметрлеріне annotationларды қосуға болады:
Function<String, String> append = (@NonNull var string) -> string + " Text";

Z(ZGC)

ZGC - жұмыс істемейтін жаңа қоқыс жинағыш. Ол жаңа жадты бөледі, бірақ оны ешқашан қайта іске қоспайды. ZGC жоғары өткізу қабілеті және төмен кідіріспен жадтың үлкен көлемін басқаруға уәде береді (ZGC тек 64 биттік платформаларда қол жетімді). Анықтамалық бояу - ZGC көрсеткішті бояу деп аталатын әдіспен 64 биттік көрсеткіштерді пайдаланады. Түсті көрсеткіштер үймедегі нысандар туралы қосымша ақпаратты сақтайды. Жад фрагменттелгенде, бұл GC жаңа бөлуге орын табу қажет болғанда өнімділіктің төмендеуін болдырмауға көмектеседі. ZGC көмегімен қоқыс жинау келесі қадамдардан тұрады:
  1. әлемдік аялдамалар: үймедегі нысандарға (мысалы, жергілікті айнымалылар немесе статикалық өрістер) жету үшін бастапқы нүктелерді іздейміз;
  2. түбірлік сілтемелерден басталатын нысан графиктерінің қиылысуы. Біз жеткен әрбір нысанды белгілейміз (ZGC нысан графигін аралап, қол жетімді нысандарды белгілей отырып, түсті маркерлерді тексереді);
  3. әлсіз сілтемелер сияқты кейбір шеткі жағдайларды өңдеу;
  4. тірі an objectілерді жылжыту, бөлуді жылдамdate үшін үйіндінің үлкен аумақтарын босату.
  5. жылжыту фазасы басталғанда, ZGC үйінді беттерге бөледі және бір уақытта бір бетпен жұмыс істейді;
  6. ZGC кез келген тамырлардың қозғалысын аяқтайды, ал қалған қозғалыс орын алады.
Бұл тақырып өте күрделі және түсініксіз. Егжей-тегжейлі талқылау бөлек мақаланы қажет етеді, сондықтан мен оны осында қалдырамын:

Epsilon GC

Epsilon — жадты бөлуді өңдейтін, бірақ нақты жадты қалпына келтіру механизмін жүзеге асырмайтын қоқыс жинағыш. Қол жетімді Java жинағы таусылғаннан кейін JVM өшеді. Яғни, егер сіз осы қоқыс жинағышпен сілтемеге байланыстырмай шексіз массивте нысан жасай бастасаңыз, қолданба OutOfMemoryError қатесіне ұшырайды (және егер басқасы болса, ол істемейді, өйткені ол сілтемесіз нысандарды тазартады) . Ол не үшін қажет? Міне, себебі:
  1. Өнімділік сынағы.
  2. Жад қысымын тексеру.
  3. VM интерфейсін тексеру.
  4. Өте қысқа жұмыс.
  5. Соңғы түсіру кідірісі жақсартулары.
  6. Соңғы түсіру өткізу қабілетін жақсартулар.
Пайдалы сілтемелер: Басқа инновациялар:
  1. ByteArrayOutputStreamvoid writeBytes(byte [])аргументтен бастап барлық byteты жазатын әдіске ие болды OutputStream.
  2. FileReaderжәне FileWriterCharset-ті көрсетуге мүмкіндік беретін жаңа конструкторлар алды.
  3. Pathекі жаңа әдісті қабылдады, жол аргументінен біріктірілген кезде жол жолын құрайтын жолды немесе жолдар тізбегін of(String, String [])қайтарады және : URI мекенжайынан Жолды қайтарады.Pathof(URI)
  4. Pattern— берілген енгізу жолының берілген үлгіге сәйкес келетінін тексеретін әдіс алды asMatchPredicate()(мысалы, ағындағы деректерді сүзу үшін тұрақты өрнекті пайдаланып предикат жасауға мүмкіндік береді ме).
  5. StringМен көптеген пайдалы әдістерді таңдадым, мысалы:
    • String strip(): бізге жолдың басы мен соңындағы барлық бос орындар жойылған жолды қайтарады (trim() сияқты, бірақ бос орындарды басқаша анықтайды);
    • String stripLeading(): жолдан кез келген жетекші бос орындарды алып тастап, бізге осы жол болып табылатын жолды қайтарады;
    • String stripTrailing(): бізге осы жол болып табылатын жолды қайтарады, жолдың соңындағы бос орындарды алып тастайды;
    • Stream lines()Stream: бізді қайтарады String, осы жолдан алынған, жолды бөлгіштермен бөлінген;
    • String repeat(int): бізге бірнеше рет қайталанатын осы жолдың жалғауы болып табылатын жолды қайтарады.
    • boolean isBlank(): егер жол бос болса немесе тек бос орындар болса, шын мәнін қайтарады, әйтпесе жалған.
  6. Thread— destroy() және stop(Throwable) әдістері жойылды.
  7. Filesбірқатар жаңа әдістерге ие болды:
    • String readString(Path): UTF-8 codeтауының көмегімен byteтардан таңбаларға дейін деcodeтау кезінде файлдағы барлық деректерді жолға оқиды;
    • String readString(Path, Charset): жоғарыдағы әдістегі сияқты, byteтардан таңбаларға дейін деcodeтау көрсетілген Charset көмегімен жүзеге асатындығымен;
    • Path writeString (Path, CharSequence, OpenOption []): Файлға таңбалар тізбегін жазады. Таңбалар UTF-8 codeтауының көмегімен byteтарға codeталады;
    • Path writeString(Path, CharSequence,Charset, OpenOption []): Жоғарыдағы әдіспен бірдей, тек таңбалар Charset ішінде көрсетілген codeтау арқылы byteтарға codeталады.
Бұл ең қызықты API инновациялары болды (менің кішіпейіл пікірім бойынша), мұнда толығырақ шолу үшін бірнеше материалдар берілген:

Java 12

Алты ай өтеді және біз Java эволюциясының келесі кезеңін көреміз. Ендеше, бір күрек білім алып, қазып алатын кез келді. 8-ден 13-ке дейін: Java нұсқаларына толық шолу.  2 - 2 бөлім

G1 жаңарту

G1 үшін келесі жақсартулар жасалды:
  1. Пайдаланылмаған бөлінген жадты қалпына келтіріңіз

    Java үйме жадысында пайдаланылмаған жад (немесе басқаша айтқанда, белсенді емес) сияқты нәрсе бар. Java 12-де олар бұл мәселені шешуге шешім қабылдады, енді:

    • G1 толық GC немесе параллель цикл кезінде үймеден жадты қайтарады; G1 толық GC алдын алуға тырысады және үйме бөлу негізінде параллельді циклды бастайды. Біз G1-ді үймеден жадты қайтаруға мәжбүрлеуіміз керек.

    Бұл жақсарту G1 пайдаланылмаған кезде жадты жинақтан операциялық жүйеге автоматты түрде қайтару арқылы өнімділікке бағытталған.

  2. Кідірту уақыты асып кеткен кезде аралас жинақтарды тоқтату

    G1 қоқыс жинауға қажетті жұмыс көлемін таңдау үшін талдау механизмін пайдаланады. Ол жинақты анықтап, тазалауды бастағаннан кейін тоқтаусыз тірі нысандарды жинайды. Бұл қоқыс жинағыштың үзіліс уақытының мақсатынан асуына әкеледі. Шындығында, бұл мәселе жақсарту арқылы шешіледі, өйткені келесі қадамды аяқтауға қажетті уақыт ақылға қонымды шектен асып кетсе, бұл қадамды тоқтатуға болады.

Микробенчмарк

Java 12 микробенчмаркинг сынақтарын енгізді, осылайша JVM өнімділігін бар эталондарды пайдаланып оңай тексеруге болады. Бұл JVM-де жұмыс істегісі келетін кез келген адамға өте пайдалы болар еді. Қосылған сынақтар Java Microbenchmark Harness (JMH) көмегімен жасалады. Бұл сынақтар JVM жүйесінде үздіксіз өнімділікті тексеруге мүмкіндік береді. JEP 230 шамамен 100 сынақты енгізуді ұсынады, Java-ның жаңа нұсқалары шыққан сайын жаңа сынақтар енгізіледі. Мұнда қосылатын сынақтардың мысалы берілген .

Шенандоах

Бұл төмен жауап беру уақытына кепілдік беруге бағытталған қоқыс жинау (ТЖ) алгоритмі (төменгі шек 10-500 мс). Бұл Java ағындарын іске қосумен бірге тазалау жұмысын орындау кезінде GC үзіліс уақытын қысқартады. Шенандоада үзіліс уақыты үйме өлшеміне тәуелсіз. Бұл кідірту уақыты үйменің өлшеміне қарамастан бірдей болатынын білдіреді. Бұл эксперименттік мүмкіндік және OpenJDK стандартты (Oracle) құрылымына қосылмаған.

Коммутаторды жақсарту

Java 12 үлгіні сәйкестендіруге арналған Switch өрнектерін жақсартты. Жаңа L → синтаксисі енгізілді. Мұнда жаңа қосқыштың негізгі нүктелерінің тізімі берілген :
  1. Жаңа синтаксис қателерді болдырмау үшін үзіліс операторының қажеттілігін жояды.
  2. Ауыстыру өрнектері енді сәтсіздікке ұшырамайды.
  3. Сонымен қатар, біз бір белгіде бірнеше тұрақты мәндерді анықтай аламыз.
  4. енді коммутатор өрнектерінде әдепкі регистр қажет.
  5. break регистрдің өзінен мәндерді қайтару үшін Switch өрнектерінде қолданылады (шын мәнінде коммутатор мәндерді қайтара алады).
Мұны мысал ретінде қарастырайық:
var result = switch (someDay) {
  case "M", "W", "F" -> "MWF";
  case "T", "TH", "S" -> "TTS";
  default -> {
      if(someDay.isEmpty())
            break "Please insert a valid day.";
      else
            break "Looks like a Sunday.";
  }
};
Java 13 ішіндегі өрнектерді ауыстыруға арналған нақты нұсқаулық Басқа жаңа мүмкіндіктер:
  1. String:

    transform(Function f)- Берілген функцияны жолға қолданады. Нәтиже жол болмауы мүмкін.
    indent(int x)— жолға x бос орындар қосады. Егер параметр теріс болса, онда алдыңғы бос орындардың бұл саны жойылады (мүмкіндігінше).

  2. Files- сияқты әдісті басып алды mismatch(), ол өз кезегінде екі файлдың мазмұнындағы бірінші сәйкес келмейтін byteтың орнын табады және қайтарады немесе сәйкессіздік болмаса -1L.

  3. CompactNumberFormatОндық санды ықшам түрде пішімдеуге арналған жаңа класс пайда болды . Бұл ықшам пішіннің мысалы 1 000 000 орнына 1М. Осылайша, тоғыз таңбаның орнына тек екі екі қажет.

  4. Сондай-ақ жаңасы бар enum, NumberFormatStyleоның екі мәні бар - LONG және SHORT.

  5. InputStream әдісін алды skipNBytes(long n) : кіріс ағынынан byteтардың n-ші санын өткізіп жіберу.

Қызықты Java 12 сілтемелері:

Java 13

Әлем бір орында тұрмайды, қозғалады, дамиды, Java - Java 13 сияқты. 8-ден 13-ке дейін: Java нұсқаларына толық шолу.  2 - 3 бөлім

Мәтіндік блок

Жолдарды анықтауға келгенде Java әрқашан аздап зардап шекті. Егер бізге бос орын, жол үзілімі, тырнақша немесе басқа нәрсе бар жолды анықтау қажет болса, бұл кейбір қиындықтарды тудырды, сондықтан арнайы таңбаларды қолдануға тура келді: мысалы, жол үзілімі үшін \n немесе жолдың бір бөлігін қашу өзі. Бұл codeтың оқылуын айтарлықтай төмендетеді және мұндай жолды жазу кезінде қосымша уақытты алады. Бұл әсіресе JSON, XML, HTML және т.б. көрсететін жолдарды жазғанда байқалады. Нәтижесінде, егер біз кішкентай Json жазғымыз келсе, ол келесідей болады:
String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Содан кейін Java 13 сахнаға шығады және мәтіннің алдында және одан кейін үш есе қос тырнақшалар түрінде шешімін ұсынады (олар мәтіндік блоктар деп атайды). Осы инновацияны пайдаланып, алдыңғы json мысалын қарастырайық:
String TEXT_BLOCK_JSON = """
{
    "name" : "someName",
    "site" : "https://www.someSite.com/"
}
""";
Бұл әлдеқайда қарапайым және түсінікті, солай емес пе? StringОсы блоктарды басқару үшін сәйкесінше үш жаңа әдіс қосылды :
  • stripIndent(): Жолдан кездейсоқ бос орындарды жояды. Бұл көп жолды жолдарды оқып жатсаңыз және анық мәлімдемеде пайда болатын кездейсоқ бос орындарды алып тастаудың бірдей түрін қолданғыңыз келсе пайдалы (негізі кездейсоқ бос орынды жою үшін компиляторды имитациялау);
  • formatted(Object... args ): ұқсас format(String format, Object... arg), бірақ мәтіндік блоктар үшін;
  • translateEscapes(): Сәйкес Юниcode мәніне аударылған шығу реттері (мысалы, \r) бар жолды қайтарады.

Коммутаторды жақсарту

Ауыстыру өрнектері Java 12-де енгізілді және 13 оларды нақтылайды. 12-де үзіліс арқылы қайтару мәндерін анықтайсыз. 13-те қайтару мәні кірістілікпен ауыстырылды. Енді Java 12 бөлімінде болған коммутатор өрнегі келесі түрде қайта жазылуы мүмкін:
var result = switch (someDay) {
  case "M", "W", "F" -> "MWF";
  case "T", "TH", "S" -> "TTS";
  default -> {
      if(someDay.isEmpty())
          yield "Please insert a valid day.";
      else
          yield "Looks like a Sunday.";
  }
};
Біз Java-мен бұрыннан таныс бағдарламашылар үшін үзілістерді қабылдау қалыпты жағдай болғанымен, бұл біртүрлі болды. Маған айтқысы келетін шындық деген не? Жаңа (салыстырмалы түрде жаңа) кірістілік кілт сөзі анық және болашақта мәндер қайтарылатын басқа жерлерде пайда болуы мүмкін. Осы тақырыпқа терең қызығушылық танытатындар үшін мына материалдармен танысуды ұсынамын:

Динамикалық CDS мұрағаттары

CDS - Class-Data Sharing. Жиі қолданылатын сыныптар жинағын кейінірек бірнеше JVM даналары жүктей алатын мұрағатқа буып-түйуге мүмкіндік береді. Бұл бізге не үшін керек? Шындығында, сыныптарды жүктеу процесінде JVM көптеген ресурстарды қажет ететін әрекеттерді орындайды, мысалы, оқу сабақтарын, оларды ішкі құрылымдарда сақтау, оқылатын сыныптардың дұрыстығын тексеру, тәуелді сыныптарды іздеу және жүктеу және т.б. ., және осының бәрінен кейін ғана сыныптар жұмысқа дайын. Түсінікті, көптеген ресурстар босқа кетеді, өйткені JVM даналары жиі бірдей сыныптарды жүктей алады. Мысалы, String, LinkedList, Integer. Жақсы, немесе бір қолданбаның сыныптары және олардың барлығы ресурстар. Егер біз барлық қажетті қадамдарды бір рет орындасақ, содан кейін қайта жасақталған сыныптарды бірнеше JVM жадына жүктеуге болатын мұрағатқа орналастырсақ, бұл жад кеңістігін айтарлықтай үнемдеуге және қолданбаны іске қосу уақытын қысқартуға болады. Шын мәнінде, CDS дәл осындай мұрағатты құруға мүмкіндік береді. Java 9 тек жүйелік сыныптарды мұрағатқа қосуға рұқсат берді. Java 10 - мұрағатқа қолданбалы сыныптарды қосу. Мұндай мұрағатты құру мыналардан тұрады:
  • қолданба арқылы жүктелген сыныптар тізімін құру;
  • біз тапқан сыныптармен өте қажет мұрағатты құру.
Java 13-тегі инновация CDS-ті жақсартады, осылайша ол қолданба аяқталған кезде мұрағат жасай алады. Бұл жоғарыдағы екі қадам енді бір қадамға біріктірілетінін білдіреді. Тағы бір маңызды мәселе: мұрағатқа тек қолданба жұмыс істеп тұрған кезде жүктелген сыныптар қосылады. Басқаша айтқанда, application.jar ішінде әлі де бар, бірақ қандай да бір себептермен жүктелмеген сыныптар мұрағатқа қосылмайды.

Socket API жаңартуы

Socket API ( java.net.Socket және java.net.ServerSocket ) негізі Java тілінің құрылған күнінен бастап ажырамас бөлігі болып табылады, бірақ соңғы жиырма жылда ұяшықтар ешқашан жаңартылмаған. C және Java тілдерінде жазылған, олар өте, өте көлемді және жөндеу қиын болды. Бірақ Java 13 осы мәселеге жеке түзетулер енгізуге шешім қабылдады және негізгі енгізуді ауыстырды. Енді PlainSocketImpl орнына провайдер интерфейсі NioSocketImpl ауыстырылды . Бұл жаңа codeталған енгізу java.nio сияқты бірдей serverлік инфрақұрылымға негізделген . Негізінде сынып синхрондалған әдістерге емес, java.util.concurrent буферінің кэші мен құлыптау механизмін (сегментке негізделген) пайдаланады. Ол бұдан былай жергілікті codeты қажет етпейді, бұл әртүрлі платформаларға өтуді жеңілдетеді. Дегенмен, бізде PlainSocketImpl пайдалануға оралу жолы бар , бірақ қазірден бастап NioSocketImpl әдепкі бойынша пайдаланылады .

ZGC үшін жадты қайтару

Естеріңізде болса, Z қоқыс жинағышы Java 11-де GC үзілісі ешқашан 10 мс аспауы үшін аз кідірістегі қоқыс жинау механизмі ретінде енгізілген. Бірақ сонымен бірге, Shenandoah және G1 сияқты басқа виртуалды GC HotSpots-тен айырмашылығы, ол пайдаланылмаған динамикалық жадты ОЖ-ға қайтара алады. Бұл модификация осы J мүмкіндігін ZGC-ге қосады. Тиісінше, біз жақсартылған өнімділікпен бірге жад ізін азайтамыз және ZGC енді белгіленген ең төменгі үйме өлшеміне жеткенше әдепкі бойынша операциялық жүйеге бекітілмеген жадты қайтарады. Тағы бір нәрсе: ZGC енді 16 ТБ ең көп қолдау көрсетілетін үйме өлшеміне ие. Бұрын 4 ТБ шек болатын. Басқа инновациялар:
  1. javax.securityjdk.sasl.disabledMechanisms- SASL механизмдерін өшіру үшін сипат қосылды .
  2. java.nioFileSystems.newFileSystem (Path, Map <String,?>)- сәйкесінше жаңа файл жасау әдісі қосылды .
  3. Сыныптарда java.nioенді абсолютті (салыстырмалыға қарағанда) getжәне set-әдістері бар. Олар, базалық дерексіз класс сияқты , буфер бөлігін шығарып алу Bufferәдісін қамтиды .slice()
  4. DOM және SAX зауыттарын іске қосу javax.xml.parsersәдістері (аттар кеңістігінің қолдауымен).
  5. Юниcodeты қолдау 12.1 нұсқасына жаңартылды.
Java 13 бойынша қызықты сілтемелер:

Нәтижелер

Біз Java 14-те жарияланған жаңалықтарды қарастыра аламыз, бірақ ол жақын арада жарық көреді - JDK 14 2020 жылдың 17 наурызында шығарылады деп жоспарланған, оны шығарылғаннан кейін бірден бөлек, толық шолу жасаған дұрыс. . Сондай-ақ, Python 2–3 сияқты шығарылымдар арасында ұзақ үзілістері бар басқа бағдарламалау тілдерінде үйлесімділік жоқ екеніне назар аударғым келеді: яғни, егер code Python 2-де жазылса, сіз оны 3 тіліне аудару үшін көп жұмыс істеу керек. Java бұл жағынан ерекше, себебі ол өте кері үйлесімді. Бұл сіздің Java 5 немесе 8 бағдарламаңыздың Java 8-13 виртуалды машинасында жұмыс істеуге кепілдік берілгенін білдіреді — әзірге алаңдаудың қажеті жоқ бірнеше ерекшеліктерді қоспағанда. Бұл басқаша жұмыс істемейтіні анық: мысалы, қолданбаңыз Java 8 JVM жүйесінде қол жетімді емес Java 13 функцияларын пайдаланса. Бүгінгі күнім осы ғана, осы уақытқа дейін оқығандарға құрмет)) 8-ден 13-ке дейін: Java нұсқаларына толық шолу.  2 - 5 бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION