JavaRush /وبلاگ جاوا /Random-FA /از 8 تا 13: مروری کامل بر نسخه های جاوا. قسمت 2

از 8 تا 13: مروری کامل بر نسخه های جاوا. قسمت 2

در گروه منتشر شد
این مقاله قسمت دوم بررسی نوآوری های من در نسخه های 8-13 جاوا است. قسمت اول اینجاست . بدون مقدمه، بیایید ادامه دهیم: به 25 سپتامبر 2018، زمانی که JDK جدید منتشر شد:

جاوا 11

از 8 تا 13: مروری کامل بر نسخه های جاوا.  قسمت 2 - 1

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 شامل مراحل زیر است:
  1. جهان متوقف می شود: ما به دنبال نقاط شروع برای رسیدن به اشیاء روی پشته (مانند متغیرهای محلی یا فیلدهای استاتیک) هستیم.
  2. تقاطع نمودارهای شی که از پیوندهای ریشه شروع می شود. هر شیئی را که به آن می‌رسیم علامت‌گذاری می‌کنیم (ZGC از نمودار شی عبور می‌کند و نشانگرهای رنگی را بررسی می‌کند و اشیاء موجود را علامت‌گذاری می‌کند).
  3. رسیدگی به برخی موارد لبه، مانند پیوندهای ضعیف؛
  4. جابجایی اجسام زنده، آزاد کردن مناطق وسیعی از پشته برای تسریع تخصیص.
  5. هنگامی که مرحله انتقال شروع می شود، ZGC پشته را به صفحات تقسیم می کند و هر بار یک صفحه کار می کند.
  6. ZGC حرکت هر ریشه را تمام می کند و بقیه حرکت رخ می دهد.
این موضوع بسیار پیچیده و گیج کننده است. یک بحث مفصل نیاز به یک مقاله جداگانه دارد، بنابراین من فقط آن را اینجا می گذارم:

اپسیلون جی سی

اپسیلون یک زباله جمع‌آور است که تخصیص حافظه را مدیریت می‌کند، اما هیچ مکانیزم بازیابی حافظه واقعی را پیاده‌سازی نمی‌کند. هنگامی که پشته جاوا در دسترس تمام شد، JVM خاموش می شود. به این معنی که اگر با این زباله جمع‌کننده بدون اتصال به مرجع شروع به ایجاد یک شی در یک آرایه بی‌نهایت کنید، برنامه با یک OutOfMemoryError خراب می‌شود (و اگر با هر دیگری، این کار را نمی‌کند، زیرا اشیاء را بدون ارجاع پاک می‌کند. ). چرا نیاز است؟ در اینجا دلیل آن است:
  1. ازمایش عملکرد.
  2. تست فشار حافظه
  3. تست رابط VM.
  4. کار بسیار کوتاه
  5. بهبود تاخیر آخرین قطره.
  6. آخرین قطره بهبود توان عملیاتی.
لینک های مفید: سایر نوآوری ها:
  1. ByteArrayOutputStreamمتدی دریافت کردم void writeBytes(byte [])که تمام بایت های آرگومان را به می نویسد OutputStream.
  2. FileReaderو FileWriterسازنده های جدیدی دریافت کرد که به شما امکان می دهد Charset را مشخص کنید.
  3. Pathدو روش جدید را برداشت، از یک آرگومان رشته ای یک مسیر یا دنباله ای از رشته ها of(String, String [])را برمی گرداند Pathکه در صورت ترکیب یک رشته مسیر و of(URI): Path را از یک URI برمی گرداند.
  4. Pattern- روشی را دریافت کرد asMatchPredicate()که بررسی می‌کند آیا رشته ورودی داده شده با الگوی داده شده مطابقت دارد یا نه (این که آیا به شما اجازه می‌دهد با استفاده از یک عبارت منظم یک گزاره ایجاد کنید تا بتوانید، برای مثال، داده‌ها را در جریان فیلتر کنید).
  5. Stringمن بسیاری از روش های مفید را انتخاب کردم، مانند:
    • String strip(): رشته‌ای را به ما برمی‌گرداند که این رشته است، با تمام فاصله‌ها در ابتدا و انتهای رشته حذف شده است (شبیه به trim()، اما فاصله‌ها را متفاوت تعریف می‌کند).
    • String stripLeading(): رشته ای که این رشته است را به ما برمی گرداند و هر فاصله پیشروی را از رشته حذف می کند.
    • String stripTrailing(): رشته ای که این رشته است را به ما برمی گرداند و هر فاصله ای را در انتهای رشته حذف می کند.
    • Stream lines()Stream: ما را از String, استخراج شده از این رشته که با جداکننده های خط جدا شده است برمی گرداند .
    • String repeat(int): رشته ای را به ما برمی گرداند که الحاقی از این رشته است که چند بار تکرار شده است.
    • boolean isBlank(): اگر رشته خالی باشد یا فقط حاوی فاصله باشد true را بر می گرداند، در غیر این صورت false.
  6. Thread- متدهای death() و stop(Throwable) حذف شده اند.
  7. 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 به بایت کدگذاری می شوند.
اینها جالب ترین نوآوری های API بودند (به نظر حقیر من)، در اینجا چند ماده برای بررسی دقیق تر آورده شده است:

جاوا 12

شش ماه می گذرد و ما شاهد مرحله بعدی تکامل جاوا هستیم. بنابراین، وقت آن است که بیل دانش را بیرون بیاوریم و حفاری کنیم. از 8 تا 13: مروری کامل بر نسخه های جاوا.  قسمت 2 - 2

G1 را به روز کنید

بهبودهای زیر برای G1 انجام شده است:
  1. حافظه اختصاص داده شده استفاده نشده را بازیابی کنید

    در حافظه پشته جاوا چیزی به نام حافظه استفاده نشده (یا به عبارت دیگر غیرفعال) وجود دارد. در جاوا 12 تصمیم گرفتند این مشکل را حل کنند، اکنون:

    • G1 حافظه را از پشته در یک GC کامل یا در طول یک حلقه موازی برمی‌گرداند. G1 سعی می کند از GC کامل جلوگیری کند و یک حلقه موازی را بر اساس تخصیص پشته شروع می کند. ما باید G1 را مجبور کنیم تا حافظه را از پشته بازگرداند.

    این بهبود با بازگرداندن خودکار حافظه از پشته به سیستم عامل زمانی که G1 استفاده نمی شود، بر عملکرد تمرکز می کند.

  2. لغو مجموعه‌های ترکیبی در صورت تجاوز از زمان مکث

    G1 از یک موتور تجزیه و تحلیل برای انتخاب میزان کار مورد نیاز برای جمع آوری زباله استفاده می کند. پس از تعریف مجموعه و شروع پاکسازی، اشیای زنده را بدون توقف جمع آوری می کند. این باعث می شود زباله جمع کننده از هدف زمان مکث خود فراتر رود. در واقع، این مشکل با بهبود حل می شود، زیرا اگر زمان اجرای مرحله بعدی فراتر از حد معقول باشد، این مرحله می تواند قطع شود.

میکرو بنچمارک

جاوا 12 تست های microbenchmarking را معرفی کرد تا عملکرد JVM را بتوان به راحتی با استفاده از معیارهای موجود آزمایش کرد. این برای هر کسی که می خواهد روی خود JVM کار کند بسیار مفید خواهد بود. تست های اضافه شده با استفاده از جاوا Microbenchmark Harness (JMH) ایجاد می شوند. این تست ها امکان تست عملکرد مداوم بر روی JVM را فراهم می کند. JEP 230 معرفی تقریباً 100 تست را پیشنهاد می‌کند که با انتشار نسخه‌های جدید جاوا، آزمایش‌های جدیدی معرفی می‌شوند. در اینجا نمونه ای از تست های اضافه شده است .

شناندوا

این یک الگوریتم جمع‌آوری زباله (GC) است که هدف آن تضمین زمان پاسخ پایین (حد پایین‌تر 10-500 میلی‌ثانیه است). این امر زمان مکث GC را هنگام انجام کار پاکسازی همزمان با اجرای موضوعات جاوا کاهش می دهد. در Shenandoah، زمان مکث مستقل از اندازه پشته است. این بدان معنی است که زمان مکث بدون توجه به اندازه پشته شما یکسان خواهد بود. این یک ویژگی آزمایشی است و در ساخت استاندارد (Oracle) OpenJDK گنجانده نشده است.

سوئیچ را بهبود بخشید

جاوا 12 عبارات سوئیچ را برای تطبیق الگو بهبود بخشیده است. یک نحو جدید L → معرفی شد. در اینجا لیستی از نکات کلیدی سوئیچ جدید آمده است :
  1. نحو جدید نیاز به دستور break برای جلوگیری از خطا را از بین می برد.
  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.";
  }
};
راهنمای قطعی برای تغییر عبارات در جاوا 13 سایر ویژگی های جدید:
  1. String:

    transform(Function f)- تابع ارائه شده را روی یک رشته اعمال می کند. نتیجه ممکن است یک رشته نباشد.
    indent(int x)- فضای x را به رشته اضافه می کند. اگر پارامتر منفی باشد، این تعداد فاصله های پیشرو حذف خواهد شد (در صورت امکان).

  2. Files- متدی مانند را گرفت mismatch()که به نوبه خود موقعیت اولین بایت نامتناسب را در محتویات دو فایل پیدا کرده و برمی گرداند، یا در صورت عدم تطابق -1L.

  3. یک کلاس جدید ظاهر شده است -CompactNumberFormat برای قالب بندی یک عدد اعشاری به شکل فشرده. نمونه ای از این فرم فشرده 1M به جای 1,000,000 است.بنابراین به جای 9 کاراکتر فقط دو دو مورد نیاز است.

  4. همچنین یک مورد جدید وجود دارد enumکه NumberFormatStyleدارای دو مقدار است - LONG و SHORT.

  5. InputStream روش را دریافت کردم skipNBytes(long n) : nامین تعداد بایت از جریان ورودی را رد کنید.

لینک های جالب جاوا 12:

جاوا 13

جهان ثابت نمی ایستد، حرکت می کند، توسعه می یابد، درست مانند جاوا - جاوا 13. از 8 تا 13: مروری کامل بر نسخه های جاوا.  قسمت 2 - 3

بلوک متن

جاوا همیشه در مورد تعریف رشته ها کمی آسیب دیده است. اگر بخواهیم یک خط را با فاصله، شکست خط، نقل قول یا چیز دیگری تعریف کنیم، این باعث ایجاد مشکلاتی شد، بنابراین مجبور شدیم از کاراکترهای ویژه استفاده کنیم: به عنوان مثال، \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 - شامل کلاس های برنامه در آرشیو. ایجاد چنین آرشیو شامل موارد زیر است:
  • ایجاد لیستی از کلاس های بارگذاری شده توسط برنامه؛
  • ایجاد یک آرشیو بسیار مورد نیاز با کلاس هایی که پیدا کردیم.
نوآوری در جاوا 13 CDS را بهبود می بخشد تا بتواند با پایان یافتن برنامه، یک بایگانی ایجاد کند. این بدان معنی است که دو مرحله بالا اکنون در یک مرحله ترکیب می شوند. و یک نکته مهم دیگر: فقط کلاس هایی که در حین اجرای برنامه بارگذاری شده اند به آرشیو اضافه می شوند. به عبارت دیگر، آن دسته از کلاس هایی که هنوز در application.jar هستند، اما به دلایلی بارگذاری نشده اند، به بایگانی اضافه نخواهند شد.

به روز رسانی 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 ترابایت محدودیت بود. سایر نوآوری ها:
  1. javax.security- یک ویژگی jdk.sasl.disabledMechanismsبرای غیرفعال کردن مکانیسم های SASL اضافه کرد.
  2. java.nio- یک روش اضافه شده است FileSystems.newFileSystem (Path, Map <String,?>)- به ترتیب، برای ایجاد یک فایل جدید.
  3. اکنون کلاس ها java.nioدارای متدهای مطلق (برخلاف نسبی) getو set-متد هستند. آنها، مانند کلاس انتزاعی پایه Buffer، شامل روشی slice()برای بازیابی بخشی از بافر هستند.
  4. javax.xml.parsersروش هایی برای نمونه سازی کارخانه های DOM و SAX (با پشتیبانی از فضای نام) اضافه شده است .
  5. پشتیبانی یونیکد به نسخه 12.1 به روز شده است.
لینک های جالب در جاوا 13:

نتایج

می‌توانیم نوآوری‌های اعلام‌شده در جاوا 14 را مرور کنیم، اما از آنجایی که به زودی روشن خواهد شد - JDK 14 برای انتشار در 17 مارس 2020 برنامه ریزی شده است، بهتر است بلافاصله پس از انتشار، یک بررسی جداگانه و کامل از آن انجام دهیم. . همچنین می خواهم توجه شما را به این واقعیت جلب کنم که در سایر زبان های برنامه نویسی با وقفه های طولانی بین نسخه ها، مانند Python 2-3، هیچ سازگاری وجود ندارد: یعنی اگر کد در پایتون 2 نوشته شده باشد، شما باید سخت کار کنید تا آن را به 3 ترجمه کنید. جاوا از این نظر خاص است زیرا بسیار عقب مانده است. این بدان معناست که برنامه جاوا 5 یا 8 شما تضمین شده است که بر روی یک ماشین مجازی جاوا 8-13 اجرا می شود — با چند استثنا که در حال حاضر نیازی به نگرانی در مورد آنها نیستید. واضح است که این کار برعکس نمی شود: به عنوان مثال، اگر برنامه شما از توابع جاوا 13 استفاده می کند که به سادگی در Java 8 JVM در دسترس نیستند. این تمام چیزی است که برای امروز دارم، احترام به کسانی که تا اینجا خوانده اند)) از 8 تا 13: مروری کامل بر نسخه های جاوا.  قسمت 2 - 5
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION