この記事はJava Advent Calendar 2023 - Qiitaの10日目の記事です。 JavaのJDK 21でバーチャル・スレッドなるものが実装されたということで少し調べてみました。参考までに、昨年のアドベントでは、Rust Tokioの非同期処理を書いています。 背景: Javaのスレッド・モデル 背景として、Javaのスレッド・モデルは、OSスレッド(1:1のJavaVMスレッド)になります。Rustのスレッド同様に、OSレベルでのスケジューリングになります。今回説明するバーチャル・スレッドと区別するために、プラットフォーム・スレッドと呼ばれています。 本ブログでは分かりやすいようにプラットフォーム・スレッドをOSスレッドと表記します。 その後、JDK 8のCompletableFutureの導入で、Node.jsのasyncのような非同期プログラミングがサポートされまし
このエントリーは Java Advent Calendar の9日目のエントリーです。 qiita.com Virtual ThraedはJava 19でPreview (JEP 425)、Java 20でSecond Preview (JEP 436)となり、うまくいけば次のLTSであるJava 21で導入予定です。 パフォーマンスを考える時に、一般的にはスループットと応答性の2つがあります。スループットは単位時間あたりにどのくらいリクエストをさばけるか、応答性は処理のリクエストから結果が帰るまでの時間です。Virtual Threadのこの2者のうち、スループットを向上させるために導入されます。 では、なぜ今になってVirtual Threadが導入されるのかということを、歴史を振り返りながら考えてみるのがこのエントリーです。 いにしえの時代 - Java 1.0からJ2SE 1.4
こんにちは。@phonypianistです。 本投稿はアクロクエスト アドベントカレンダー 12月21日 の記事です。 最近、Quarkusアプリを本番適用しました。 QuarkusはJavaアプリを作るための軽量なフレームワークで起動が速いって聞くけど、実際どれくらい速いんだろう?と気になったので、Spring Bootや、類似OSSのMicronautと比べてみました。 背景 JavaのフレームワークといえばSpringBootが主流ですが、起動が遅かったり、必要なメモリが多かったりしています。 これは、アプリ起動時にリフレクションを用いてDI(Dependency Injection)を行っているのが要因の1つです。 マイクロサービス、コンテナネイティブなアプリケーションは、負荷の状況に応じて、シームレスにスケールアウトできる必要があります。 アプリケーションの起動速度が遅かったり、
こんにちは、NRIデジタルの島です。 昨年のre:Inventにて、AWS Lambda(以下Lambda)にコールドスタートの性能を大幅に改善し、初回起動を高速化する「SnapStart機能」のリリースが発表されました。 New – Accelerate Your Lambda Functions with Lambda SnapStart サーバレスアーキテクチャであるLambdaを使用してアプリケーションを構築する際、必ず課題となるのが「コールドスタートにおける処理遅延」です。特にJavaの場合フットプリントも大きく、またJIT(Just-In-Time)等アプリケーションアーキテクチャの特性上初動が遅いです。ひとたびコードが最適化されると他の言語よりも高速になりますが、初動時からスピードが求められるサーバレスアーキテクチャとの相性はあまり良くないです。これが原因で「Lambdaには
概要 前回では、ヒープ上に確保したByteBufferと、ダイレクトバッファとして作成したByteBufferでのデータの読み取りパフォーマンスを比較した結果、圧倒的にダイレクトバッファが速いことが分かった。 しかし上記ベンチマークは、あえてByteBuffer単体でのパフォーマンスの比較を行ったものであり、実際のファイル入出力処理を含んだ比較ではない。 いわば、純粋なByteBufferの性能比較である。 では、実際にファイルの読み取りを含んだ場合でも、はたしてダイレクトバッファを使ったほうが速いのであろうか? 今回は、実際の利用方法を意識して、このあたりを調べてみることとする。 ヒープバッファとダイレクトバッファの違い ByteBufferには大きく分けて2種類がある。 ヒープ上の作成されるヒープバッファ ネイティブ領域に作成されるダイレクトバッファ ヒープバッファは以下のように作成さ
Javaでファイルマップを行ったときの動きについて調査したのでまとめる。 環境 CentOS7.3.1611、openjdk-1.8.0.131 C言語でopen+mmapシステムコールを利用し、ファイルをメモリ上にマップすることが出来るが、Javaでの利用が以前から気になっていたが 実際に試してみる。 以下のソースで評価する。 import java.lang.Thread; import java.io.File; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class mmap01 { public static void main(String[] args) throws Exception { for
閏年(うるうどし)の話題。 Twitterで見かけた話題で「西暦1年は閏年かどうかぱっとわからん人おる?」という些か煽り気味のツイートを見かけたのだけども、反射的に「閏年じゃないに決まってるじゃん」とぱっと答えてしまわないだろうか。本当にそうだろうか? そう単純な話なのだろうか? プログラミングを学んでカレンダーを扱うことを学ぶ際に置閏法についても簡単に触れられることがある。置閏法というのは閏年や閏月(太陰暦では1年が13ヵ月になるケースがあり追加の月を閏月と呼ぶ)をどのようなルールで挿入するかという話で、まさにアルゴリズムであるからプログラミングの話題と相性がいい。 置閏法 現代の西暦の置閏法(ちじゅんほう)は 西暦を 400 で割り切れる年は閏年 上記以外で西暦を 100 で割り切れる年は平年 上記以外で西暦を 4 で割り切れる年は閏年 上記以外は平年 といった手続きで閏年(つまり2月
plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' sourceCompatibility = '11' targetCompatibility = '11' compileJava.options.encoding = "UTF-8" repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' } package sample.jul; import org.slf4j.LoggerFactory; import org.sprin
(updated for Java 8) One of the great features of modern programming languages is structural pattern matching on algebraic data types. Once you’ve used this feature, you don’t ever want to program without it. You will find this in languages like Haskell and Scala. In Scala, algebraic types are provided by case classes. For example:
CompletableFutureの公式ドキュメントはこちら CompletableFutureはタスク並列の記述に向いています。 まずはもっとも簡単な例から見てみます。以下のメソッドを使うのが手頃です。 supplyAsync runAsync 非同期でタスクを実行して、結果を表示させてみます。 @Slf4j public class AsyncTask { ExecutorService es = Executors.newCachedThreadPool(); public void sendData() { CompletableFuture.supplyAsync(this::runTask, es).thenApply(this::sendMsg) .thenAccept(this::notify); } public String runTask() { try { int
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く