Java 11
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 көмегімен қоқыс жинау келесі қадамдардан тұрады:- әлемдік аялдамалар: үймедегі нысандарға (мысалы, жергілікті айнымалылар немесе статикалық өрістер) жету үшін бастапқы нүктелерді іздейміз;
- түбірлік сілтемелерден басталатын нысан графиктерінің қиылысуы. Біз жеткен әрбір нысанды белгілейміз (ZGC нысан графигін аралап, қол жетімді нысандарды белгілей отырып, түсті маркерлерді тексереді);
- әлсіз сілтемелер сияқты кейбір шеткі жағдайларды өңдеу;
- тірі an objectілерді жылжыту, бөлуді жылдамdate үшін үйіндінің үлкен аумақтарын босату.
- жылжыту фазасы басталғанда, ZGC үйінді беттерге бөледі және бір уақытта бір бетпен жұмыс істейді;
- ZGC кез келген тамырлардың қозғалысын аяқтайды, ал қалған қозғалыс орын алады.
- ZGC-ке кіріспе: масштабталатын және тәжірибелік төмен кідіріс JVM қоқыс жинағышы
- Open JDK үшін үй қоқыс жинағыш
- Java-ның жаңа Z қоқыс жинағышы (ZGC) өте қызықты
Epsilon GC
Epsilon — жадты бөлуді өңдейтін, бірақ нақты жадты қалпына келтіру механизмін жүзеге асырмайтын қоқыс жинағыш. Қол жетімді Java жинағы таусылғаннан кейін JVM өшеді. Яғни, егер сіз осы қоқыс жинағышпен сілтемеге байланыстырмай шексіз массивте нысан жасай бастасаңыз, қолданба OutOfMemoryError қатесіне ұшырайды (және егер басқасы болса, ол істемейді, өйткені ол сілтемесіз нысандарды тазартады) . Ол не үшін қажет? Міне, себебі:- Өнімділік сынағы.
- Жад қысымын тексеру.
- VM интерфейсін тексеру.
- Өте қысқа жұмыс.
- Соңғы түсіру кідірісі жақсартулары.
- Соңғы түсіру өткізу қабілетін жақсартулар.
- Жаңа GC Epsilon. Java-да қоқыс жинау болмауы мүмкін. Шок. Сенсация
- Epsilon GC-ке кіріспе: жұмыс істемейтін эксперименталды қоқыс жинағыш
ByteArrayOutputStream
void writeBytes(byte [])
аргументтен бастап барлық byteты жазатын әдіске ие болдыOutputStream
.FileReader
жәнеFileWriter
Charset-ті көрсетуге мүмкіндік беретін жаңа конструкторлар алды.Path
екі жаңа әдісті қабылдады, жол аргументінен біріктірілген кезде жол жолын құрайтын жолды немесе жолдар тізбегінof(String, String [])
қайтарады және : URI мекенжайынан Жолды қайтарады.Path
of(URI)
Pattern
— берілген енгізу жолының берілген үлгіге сәйкес келетінін тексеретін әдіс алдыasMatchPredicate()
(мысалы, ағындағы деректерді сүзу үшін тұрақты өрнекті пайдаланып предикат жасауға мүмкіндік береді ме).String
Мен көптеген пайдалы әдістерді таңдадым, мысалы:String strip()
: бізге жолдың басы мен соңындағы барлық бос орындар жойылған жолды қайтарады (trim() сияқты, бірақ бос орындарды басқаша анықтайды);String stripLeading()
: жолдан кез келген жетекші бос орындарды алып тастап, бізге осы жол болып табылатын жолды қайтарады;String stripTrailing()
: бізге осы жол болып табылатын жолды қайтарады, жолдың соңындағы бос орындарды алып тастайды;Stream lines()
Stream
: бізді қайтарадыString
, осы жолдан алынған, жолды бөлгіштермен бөлінген;String repeat(int)
: бізге бірнеше рет қайталанатын осы жолдың жалғауы болып табылатын жолды қайтарады.boolean isBlank()
: егер жол бос болса немесе тек бос орындар болса, шын мәнін қайтарады, әйтпесе жалған.
Thread
— destroy() және stop(Throwable) әдістері жойылды.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талады.
Java 12
Алты ай өтеді және біз Java эволюциясының келесі кезеңін көреміз. Ендеше, бір күрек білім алып, қазып алатын кез келді.G1 жаңарту
G1 үшін келесі жақсартулар жасалды:-
Пайдаланылмаған бөлінген жадты қалпына келтіріңіз
Java үйме жадысында пайдаланылмаған жад (немесе басқаша айтқанда, белсенді емес) сияқты нәрсе бар. Java 12-де олар бұл мәселені шешуге шешім қабылдады, енді:
- G1 толық GC немесе параллель цикл кезінде үймеден жадты қайтарады; G1 толық GC алдын алуға тырысады және үйме бөлу негізінде параллельді циклды бастайды. Біз G1-ді үймеден жадты қайтаруға мәжбүрлеуіміз керек.
Бұл жақсарту G1 пайдаланылмаған кезде жадты жинақтан операциялық жүйеге автоматты түрде қайтару арқылы өнімділікке бағытталған.
-
Кідірту уақыты асып кеткен кезде аралас жинақтарды тоқтату
G1 қоқыс жинауға қажетті жұмыс көлемін таңдау үшін талдау механизмін пайдаланады. Ол жинақты анықтап, тазалауды бастағаннан кейін тоқтаусыз тірі нысандарды жинайды. Бұл қоқыс жинағыштың үзіліс уақытының мақсатынан асуына әкеледі. Шындығында, бұл мәселе жақсарту арқылы шешіледі, өйткені келесі қадамды аяқтауға қажетті уақыт ақылға қонымды шектен асып кетсе, бұл қадамды тоқтатуға болады.
Микробенчмарк
Java 12 микробенчмаркинг сынақтарын енгізді, осылайша JVM өнімділігін бар эталондарды пайдаланып оңай тексеруге болады. Бұл JVM-де жұмыс істегісі келетін кез келген адамға өте пайдалы болар еді. Қосылған сынақтар Java Microbenchmark Harness (JMH) көмегімен жасалады. Бұл сынақтар JVM жүйесінде үздіксіз өнімділікті тексеруге мүмкіндік береді. JEP 230 шамамен 100 сынақты енгізуді ұсынады, Java-ның жаңа нұсқалары шыққан сайын жаңа сынақтар енгізіледі. Мұнда қосылатын сынақтардың мысалы берілген .Шенандоах
Бұл төмен жауап беру уақытына кепілдік беруге бағытталған қоқыс жинау (ТЖ) алгоритмі (төменгі шек 10-500 мс). Бұл Java ағындарын іске қосумен бірге тазалау жұмысын орындау кезінде GC үзіліс уақытын қысқартады. Шенандоада үзіліс уақыты үйме өлшеміне тәуелсіз. Бұл кідірту уақыты үйменің өлшеміне қарамастан бірдей болатынын білдіреді. Бұл эксперименттік мүмкіндік және OpenJDK стандартты (Oracle) құрылымына қосылмаған.Коммутаторды жақсарту
Java 12 үлгіні сәйкестендіруге арналған Switch өрнектерін жақсартты. Жаңа L → синтаксисі енгізілді. Мұнда жаңа қосқыштың негізгі нүктелерінің тізімі берілген :- Жаңа синтаксис қателерді болдырмау үшін үзіліс операторының қажеттілігін жояды.
- Ауыстыру өрнектері енді сәтсіздікке ұшырамайды.
- Сонымен қатар, біз бір белгіде бірнеше тұрақты мәндерді анықтай аламыз.
- енді коммутатор өрнектерінде әдепкі регистр қажет.
- 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 ішіндегі өрнектерді ауыстыруға арналған нақты нұсқаулық Басқа жаңа мүмкіндіктер:
-
String:
transform(Function f)
- Берілген функцияны жолға қолданады. Нәтиже жол болмауы мүмкін.indent(int x)
— жолға x бос орындар қосады. Егер параметр теріс болса, онда алдыңғы бос орындардың бұл саны жойылады (мүмкіндігінше). -
Files
- сияқты әдісті басып алдыmismatch()
, ол өз кезегінде екі файлдың мазмұнындағы бірінші сәйкес келмейтін byteтың орнын табады және қайтарады немесе сәйкессіздік болмаса -1L. -
CompactNumberFormat
Ондық санды ықшам түрде пішімдеуге арналған жаңа класс пайда болды . Бұл ықшам пішіннің мысалы 1 000 000 орнына 1М. Осылайша, тоғыз таңбаның орнына тек екі екі қажет. -
Сондай-ақ жаңасы бар
enum
,NumberFormatStyle
оның екі мәні бар - LONG және SHORT. -
InputStream
әдісін алдыskipNBytes(long n)
: кіріс ағынынан byteтардың n-ші санын өткізіп жіберу.
- Java 12 осында: не жаңалық?
- Java 12-де қандай жаңалықтар бар
- Java 12-дегі жаңалықтар (Witcher Programmer блогының жазбаларынан)
Java 13
Әлем бір орында тұрмайды, қозғалады, дамиды, Java - Java 13 сияқты.Мәтіндік блок
Жолдарды анықтауға келгенде 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 - мұрағатқа қолданбалы сыныптарды қосу. Мұндай мұрағатты құру мыналардан тұрады:- қолданба арқылы жүктелген сыныптар тізімін құру;
- біз тапқан сыныптармен өте қажет мұрағатты құру.
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 ТБ шек болатын. Басқа инновациялар:javax.security
jdk.sasl.disabledMechanisms
- SASL механизмдерін өшіру үшін сипат қосылды .java.nio
FileSystems.newFileSystem (Path, Map <String,?>)
- сәйкесінше жаңа файл жасау әдісі қосылды .- Сыныптарда
java.nio
енді абсолютті (салыстырмалыға қарағанда)get
жәнеset
-әдістері бар. Олар, базалық дерексіз класс сияқты , буфер бөлігін шығарып алуBuffer
әдісін қамтиды .slice()
- DOM және SAX зауыттарын іске қосу
javax.xml.parsers
әдістері (аттар кеңістігінің қолдауымен). - Юниcodeты қолдау 12.1 нұсқасына жаңартылды.
- Java 13: Жаңа мүмкіндіктер
- Java 13 туралы барлығы: жаңартулар әлеміне сүңгу
- 81 JDK 13 жүйесіндегі жаңа мүмкіндіктер мен API интерфейстері
GO TO FULL VERSION