جاوا 11
var (به زبان لامبدا)
از این به بعد، میتوانیم انواع پارامترهای لامبدا را مشخص کنیم یا هنگام نوشتن یک عبارت لامبدا آنها را حذف کنیم (عبارات لامبدا که به طور ضمنی تایپ میشوند):Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
همچنین می توانید بدون نیاز به نوشتن نام نوع متغیر کامل، حاشیه نویسی به پارامترهای لامبدا اضافه کنید:
Function<String, String> append = (@NonNull var string) -> string + " Text";
Z (ZGC)
ZGC یک زباله جمع کن جدید است که کار نمی کند. حافظه جدید را اختصاص می دهد اما هرگز آن را مجددا راه اندازی نمی کند. ZGC وعده داده است که حجم زیادی از حافظه را با توان عملیاتی بالا و تأخیر کم مدیریت کند (ZGC فقط در پلتفرم های 64 بیتی موجود است). رنگآمیزی مرجع - ZGC از نشانگرهای 64 بیتی با تکنیکی به نام رنگآمیزی اشارهگر استفاده میکند. اشاره گرهای رنگی اطلاعات بیشتری در مورد اشیاء روی پشته ذخیره می کنند. هنگامی که حافظه تکه تکه می شود، این امر به جلوگیری از کاهش عملکرد در زمانی که GC نیاز دارد فضایی برای تخصیص جدید پیدا کند، کمک می کند. جمع آوری زباله با استفاده از ZGC شامل مراحل زیر است:- جهان متوقف می شود: ما به دنبال نقاط شروع برای رسیدن به اشیاء روی پشته (مانند متغیرهای محلی یا فیلدهای استاتیک) هستیم.
- تقاطع نمودارهای شی که از پیوندهای ریشه شروع می شود. هر شیئی را که به آن میرسیم علامتگذاری میکنیم (ZGC از نمودار شی عبور میکند و نشانگرهای رنگی را بررسی میکند و اشیاء موجود را علامتگذاری میکند).
- رسیدگی به برخی موارد لبه، مانند پیوندهای ضعیف؛
- جابجایی اجسام زنده، آزاد کردن مناطق وسیعی از پشته برای تسریع تخصیص.
- هنگامی که مرحله انتقال شروع می شود، ZGC پشته را به صفحات تقسیم می کند و هر بار یک صفحه کار می کند.
- ZGC حرکت هر ریشه را تمام می کند و بقیه حرکت رخ می دهد.
- مقدمه ای بر ZGC: جمع آوری زباله JVM مقیاس پذیر و آزمایشی با تاخیر کم
- زباله جمع کن خانگی برای Open JDK
- جمع آوری زباله Z جدید جاوا (ZGC) بسیار هیجان انگیز است
اپسیلون جی سی
اپسیلون یک زباله جمعآور است که تخصیص حافظه را مدیریت میکند، اما هیچ مکانیزم بازیابی حافظه واقعی را پیادهسازی نمیکند. هنگامی که پشته جاوا در دسترس تمام شد، JVM خاموش می شود. به این معنی که اگر با این زباله جمعکننده بدون اتصال به مرجع شروع به ایجاد یک شی در یک آرایه بینهایت کنید، برنامه با یک OutOfMemoryError خراب میشود (و اگر با هر دیگری، این کار را نمیکند، زیرا اشیاء را بدون ارجاع پاک میکند. ). چرا نیاز است؟ در اینجا دلیل آن است:- ازمایش عملکرد.
- تست فشار حافظه
- تست رابط VM.
- کار بسیار کوتاه
- بهبود تاخیر آخرین قطره.
- آخرین قطره بهبود توان عملیاتی.
- جی سی اپسیلون جدید. جاوا ممکن است جمع آوری زباله نداشته باشد. شوکه شدن. احساس
- مقدمه ای بر اپسیلون جی سی: جمع آوری زباله تجربی بدون عملیات
ByteArrayOutputStream
متدی دریافت کردمvoid writeBytes(byte [])
که تمام بایت های آرگومان را به می نویسدOutputStream
.FileReader
وFileWriter
سازنده های جدیدی دریافت کرد که به شما امکان می دهد Charset را مشخص کنید.Path
دو روش جدید را برداشت، از یک آرگومان رشته ای یک مسیر یا دنباله ای از رشته هاof(String, String [])
را برمی گرداندPath
که در صورت ترکیب یک رشته مسیر وof(URI)
: Path را از یک URI برمی گرداند.Pattern
- روشی را دریافت کردasMatchPredicate()
که بررسی میکند آیا رشته ورودی داده شده با الگوی داده شده مطابقت دارد یا نه (این که آیا به شما اجازه میدهد با استفاده از یک عبارت منظم یک گزاره ایجاد کنید تا بتوانید، برای مثال، دادهها را در جریان فیلتر کنید).String
من بسیاری از روش های مفید را انتخاب کردم، مانند:String strip()
: رشتهای را به ما برمیگرداند که این رشته است، با تمام فاصلهها در ابتدا و انتهای رشته حذف شده است (شبیه به trim()، اما فاصلهها را متفاوت تعریف میکند).String stripLeading()
: رشته ای که این رشته است را به ما برمی گرداند و هر فاصله پیشروی را از رشته حذف می کند.String stripTrailing()
: رشته ای که این رشته است را به ما برمی گرداند و هر فاصله ای را در انتهای رشته حذف می کند.Stream lines()
Stream
: ما را ازString
, استخراج شده از این رشته که با جداکننده های خط جدا شده است برمی گرداند .String repeat(int)
: رشته ای را به ما برمی گرداند که الحاقی از این رشته است که چند بار تکرار شده است.boolean isBlank()
: اگر رشته خالی باشد یا فقط حاوی فاصله باشد true را بر می گرداند، در غیر این صورت false.
Thread
- متدهای death() و stop(Throwable) حذف شده اند.Files
تعدادی روش جدید دریافت کرد:String readString(Path)
: تمام داده ها را از یک فایل به یک رشته می خواند، در حالی که رمزگشایی از بایت به کاراکتر با استفاده از رمزگذاری UTF-8.String readString(Path, Charset)
: مانند روش بالا، با این تفاوت که رمزگشایی از بایت به کاراکتر با استفاده از Charset مشخص شده انجام می شود.Path writeString (Path, CharSequence, OpenOption [])
: دنباله ای از کاراکترها را در یک فایل می نویسد. کاراکترها با استفاده از رمزگذاری UTF-8 به بایت کدگذاری می شوند.Path writeString(Path, CharSequence,Charset, OpenOption [])
: همان روش بالا، فقط کاراکترها با استفاده از رمزگذاری مشخص شده در Charset به بایت کدگذاری می شوند.
جاوا 12
شش ماه می گذرد و ما شاهد مرحله بعدی تکامل جاوا هستیم. بنابراین، وقت آن است که بیل دانش را بیرون بیاوریم و حفاری کنیم.G1 را به روز کنید
بهبودهای زیر برای G1 انجام شده است:-
حافظه اختصاص داده شده استفاده نشده را بازیابی کنید
در حافظه پشته جاوا چیزی به نام حافظه استفاده نشده (یا به عبارت دیگر غیرفعال) وجود دارد. در جاوا 12 تصمیم گرفتند این مشکل را حل کنند، اکنون:
- G1 حافظه را از پشته در یک GC کامل یا در طول یک حلقه موازی برمیگرداند. G1 سعی می کند از GC کامل جلوگیری کند و یک حلقه موازی را بر اساس تخصیص پشته شروع می کند. ما باید G1 را مجبور کنیم تا حافظه را از پشته بازگرداند.
این بهبود با بازگرداندن خودکار حافظه از پشته به سیستم عامل زمانی که G1 استفاده نمی شود، بر عملکرد تمرکز می کند.
-
لغو مجموعههای ترکیبی در صورت تجاوز از زمان مکث
G1 از یک موتور تجزیه و تحلیل برای انتخاب میزان کار مورد نیاز برای جمع آوری زباله استفاده می کند. پس از تعریف مجموعه و شروع پاکسازی، اشیای زنده را بدون توقف جمع آوری می کند. این باعث می شود زباله جمع کننده از هدف زمان مکث خود فراتر رود. در واقع، این مشکل با بهبود حل می شود، زیرا اگر زمان اجرای مرحله بعدی فراتر از حد معقول باشد، این مرحله می تواند قطع شود.
میکرو بنچمارک
جاوا 12 تست های microbenchmarking را معرفی کرد تا عملکرد JVM را بتوان به راحتی با استفاده از معیارهای موجود آزمایش کرد. این برای هر کسی که می خواهد روی خود JVM کار کند بسیار مفید خواهد بود. تست های اضافه شده با استفاده از جاوا Microbenchmark Harness (JMH) ایجاد می شوند. این تست ها امکان تست عملکرد مداوم بر روی JVM را فراهم می کند. JEP 230 معرفی تقریباً 100 تست را پیشنهاد میکند که با انتشار نسخههای جدید جاوا، آزمایشهای جدیدی معرفی میشوند. در اینجا نمونه ای از تست های اضافه شده است .شناندوا
این یک الگوریتم جمعآوری زباله (GC) است که هدف آن تضمین زمان پاسخ پایین (حد پایینتر 10-500 میلیثانیه است). این امر زمان مکث GC را هنگام انجام کار پاکسازی همزمان با اجرای موضوعات جاوا کاهش می دهد. در Shenandoah، زمان مکث مستقل از اندازه پشته است. این بدان معنی است که زمان مکث بدون توجه به اندازه پشته شما یکسان خواهد بود. این یک ویژگی آزمایشی است و در ساخت استاندارد (Oracle) OpenJDK گنجانده نشده است.سوئیچ را بهبود بخشید
جاوا 12 عبارات سوئیچ را برای تطبیق الگو بهبود بخشیده است. یک نحو جدید L → معرفی شد. در اینجا لیستی از نکات کلیدی سوئیچ جدید آمده است :- نحو جدید نیاز به دستور break برای جلوگیری از خطا را از بین می برد.
- تغییر عبارات دیگر خراب نمی شود.
- علاوه بر این، میتوانیم چندین ثابت را در یک برچسب تعریف کنیم.
- حروف پیش فرض در حال حاضر در عبارات سوئیچ مورد نیاز است.
- 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.";
}
};
راهنمای قطعی برای تغییر عبارات در جاوا 13 سایر ویژگی های جدید:
-
String:
transform(Function f)
- تابع ارائه شده را روی یک رشته اعمال می کند. نتیجه ممکن است یک رشته نباشد.indent(int x)
- فضای x را به رشته اضافه می کند. اگر پارامتر منفی باشد، این تعداد فاصله های پیشرو حذف خواهد شد (در صورت امکان). -
Files
- متدی مانند را گرفتmismatch()
که به نوبه خود موقعیت اولین بایت نامتناسب را در محتویات دو فایل پیدا کرده و برمی گرداند، یا در صورت عدم تطابق -1L. -
یک کلاس جدید ظاهر شده است -
CompactNumberFormat
برای قالب بندی یک عدد اعشاری به شکل فشرده. نمونه ای از این فرم فشرده 1M به جای 1,000,000 است.بنابراین به جای 9 کاراکتر فقط دو دو مورد نیاز است. -
همچنین یک مورد جدید وجود دارد
enum
کهNumberFormatStyle
دارای دو مقدار است - LONG و SHORT. -
InputStream
روش را دریافت کردمskipNBytes(long n)
: nامین تعداد بایت از جریان ورودی را رد کنید.
- جاوا 12 اینجاست: چه چیزی جدید است؟
- موارد جدید در جاوا 12
- تازه های جاوا 12 (از وبلاگ Notes of a Witcher Programmer)
جاوا 13
جهان ثابت نمی ایستد، حرکت می کند، توسعه می یابد، درست مانند جاوا - جاوا 13.بلوک متن
جاوا همیشه در مورد تعریف رشته ها کمی آسیب دیده است. اگر بخواهیم یک خط را با فاصله، شکست خط، نقل قول یا چیز دیگری تعریف کنیم، این باعث ایجاد مشکلاتی شد، بنابراین مجبور شدیم از کاراکترهای ویژه استفاده کنیم: به عنوان مثال، \n برای یک شکست خط، یا فرار از برخی از خط. خود این به طور قابل توجهی خوانایی کد را کاهش می دهد و هنگام نوشتن چنین خطی زمان بیشتری را می گیرد. این امر به ویژه هنگام نوشتن رشته هایی که JSON، XML، HTML و غیره را نمایش می دهند، قابل توجه می شود. در نتیجه، اگر بخواهیم یک Json کوچک بنویسیم، چیزی شبیه به این خواهد بود:String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
و سپس جاوا 13 وارد صحنه می شود و راه حل خود را در قالب نقل قول های سه گانه قبل و بعد از متن (که آنها بلوک های متنی نامیده اند) به ما ارائه می دهد. بیایید به مثال قبلی json با استفاده از این نوآوری نگاه کنیم:
String TEXT_BLOCK_JSON = """
{
"name" : "someName",
"site" : "https://www.someSite.com/"
}
""";
بسیار ساده تر و واضح تر، اینطور نیست؟ String
سه روش جدید نیز به ترتیب برای مدیریت این بلوک ها اضافه شد :
stripIndent()
: فاصله های تصادفی را از یک رشته حذف می کند. اگر رشتههای چند خطی را میخوانید و میخواهید همان نوع حذف فضای خالی تصادفی را که با یک اعلان صریح اتفاق میافتد را اعمال کنید، مفید است (که اساساً کامپایلر را برای حذف فضای سفید تصادفی شبیهسازی میکند).formatted(Object... args )
: مشابهformat(String format, Object... arg)
، اما برای بلوک های متنی.translateEscapes()
: رشته ای را با دنباله های فرار (مانند \r) به مقدار یونیکد مربوطه برمی گرداند.
سوئیچ را بهبود بخشید
عبارات سوییچ در جاوا 12 معرفی شدند و 13 آنها را اصلاح می کند. در 12 شما مقادیر بازگشتی را با استفاده از break تعریف می کنید. در 13، مقدار بازگشتی با بازده جایگزین شد. حال عبارت سوئیچ که در بخش جاوا 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.";
}
};
اگرچه برای ما برنامه نویسانی که قبلاً با جاوا آشنا بودند عادی بود که شکستن را بپذیریم، با این وجود کاملاً عجیب بود. تلاش برای گفتن به من چیست؟ کلمه کلیدی بازده جدید (نسبتا جدید) واضح تر است و ممکن است در مکان های دیگری در آینده که مقادیر برگردانده می شوند ظاهر شود. برای کسانی که عمیقاً به این موضوع علاقه مند هستند، توصیه می کنم با این مطالب آشنا شوند:
بایگانی CDS پویا
CDS - Class-Data Sharing. به شما امکان میدهد مجموعهای از کلاسهای پرکاربرد را در یک بایگانی بسته بندی کنید که بعداً میتواند توسط چندین نمونه JVM بارگیری شود. چرا ما به این نیاز داریم؟ واقعیت این است که در فرآیند بارگیری کلاسها، JVM اقدامات بسیار زیادی را انجام میدهد که منابع زیادی مصرف میکنند، مانند خواندن کلاسها، ذخیره آنها در ساختارهای داخلی، بررسی صحت کلاسهای خوانده شده، جستجو و بارگذاری کلاسهای وابسته و غیره. .، و فقط بعد از این همه کلاس ها آماده کار می شوند. قابل درک است که منابع زیادی هدر میرود، زیرا نمونههای JVM اغلب میتوانند همان کلاسها را بارگیری کنند. برای مثال String، LinckedList، Integer. خوب، یا کلاس های یک برنامه، و همه اینها منابع هستند. اگر تمام مراحل لازم را فقط یک بار انجام دهیم و سپس کلاسهای طراحیشده مجدد را در آرشیوی قرار دهیم که میتوان آن را در حافظه چند JVM بارگذاری کرد، این میتواند به میزان قابل توجهی در فضای حافظه صرفهجویی کند و زمان راهاندازی برنامه را کاهش دهد. در واقع CDS امکان ایجاد چنین آرشیو را فراهم می کند. جاوا 9 فقط اجازه می داد که کلاس های سیستم به آرشیو اضافه شوند. جاوا 10 - شامل کلاس های برنامه در آرشیو. ایجاد چنین آرشیو شامل موارد زیر است:- ایجاد لیستی از کلاس های بارگذاری شده توسط برنامه؛
- ایجاد یک آرشیو بسیار مورد نیاز با کلاس هایی که پیدا کردیم.
به روز رسانی Socket API
Socket API ( java.net.Socket و java.net.ServerSocket ) اساساً بخشی جدایی ناپذیر از جاوا از زمان پیدایش آن است، اما سوکت ها هرگز در بیست سال گذشته به روز نشده اند. با زبان C و جاوا نوشته شده بودند، بسیار بسیار حجیم و نگهداری آنها سخت بود. اما جاوا 13 تصمیم گرفت تا تنظیمات خود را برای کل این موضوع انجام دهد و پیاده سازی پایه را جایگزین کرد. اکنون، به جای PlainSocketImpl، رابط ارائه دهنده با NioSocketImpl جایگزین شده است . این پیادهسازی کدگذاریشده جدید بر اساس همان زیرساخت بکاند java.nio است . اساساً کلاس از حافظه نهان بافر همزمان java.util.concurrent و مکانیسم قفل (که مبتنی بر بخش هستند) به جای روش های همگام استفاده می کند. این دیگر نیازی به کد بومی ندارد و انتقال آن به پلتفرم های مختلف را آسان تر می کند. با این حال، ما راهی برای بازگشت به استفاده از PlainSocketImpl داریم ، اما از این پس NioSocketImpl به طور پیش فرض استفاده می شود .بازگشت حافظه برای ZGC
همانطور که به یاد داریم، جمعآوری زباله Z در جاوا 11 به عنوان مکانیزم جمعآوری زباله با تأخیر کم معرفی شد، به طوری که مکث GC هرگز از 10 میلیثانیه تجاوز نمیکند. اما در عین حال، بر خلاف سایر نقاط مجازی GC، مانند Shenandoah و G1، می تواند حافظه پویا استفاده نشده را به سیستم عامل بازگرداند. این اصلاح این قابلیت 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()
برای بازیابی بخشی از بافر هستند. javax.xml.parsers
روش هایی برای نمونه سازی کارخانه های DOM و SAX (با پشتیبانی از فضای نام) اضافه شده است .- پشتیبانی یونیکد به نسخه 12.1 به روز شده است.
- جاوا 13: ویژگی های جدید
- همه چیز درباره جاوا 13: غواصی در دنیای به روز رسانی
- 81 ویژگی و API جدید در JDK 13
GO TO FULL VERSION