JAVA関連のことを調べてみた

JAVA関連のことを調べてみた

OpenJ9 JVM の heap dumpをMemory Analyzerで解析する

:::note info
2023/11/20
新規作成
:::

#### 経緯・課題
・業務で java heap dump の仕様を調査する必要があり、memory analyzerをMacOSに導入したので備忘録として残しておきます。


#### 前提・環境など
・MacOS Sonoma (14.1) Apple M1 Pro
・java jdk-17.0.8.1+1 (IBM OpenJ9)


#### 参考知識

・[IBM SDK, Java Technology Edition 8 – 診断ツールおよびデータ](https://www.ibm.com/docs/ja/sdk-java-technology/8?topic=component-diagnostic-tools-data)


#### 1.二種類のMATツール
 Memory Analyzer tool (MAT)は2種類利用方法があります。
 ・Eclipse版
  Eclipseを普段から利用している場合、Eclipseにプラグインとして追加することが可能です。

 ・スタン

元記事を表示

抽象クラスのテストはモックを使うといいかも

## 目次
– [1. TemplateMethod パターン](#1-templatemethod-パターン)
– [2. 環境情報](#2-環境情報)
– [3. 実装](#3-実装)
– [4. テスト](#4-テスト)
– [5. まとめ](#5-まとめ)
– [参考文献](#参考文献)

## 1. TemplateMethod パターン
[Java 100 本ノック](https://github.com/JustSystems/java-100practices)を使わせていただき、Java の実装力を上げるべく取り組んでいます。[73 本目](https://github.com/JustSystems/java-100practices/tree/master/contents/073)では、クラス図を見て実装をする問題で、TemplateMethod パターンを使用していました。これまで抽象クラスを実装したことがなくいい練習になったのですが、テストをどう書くか悩みました。中朝クラスを継承するクラスのテストでまとめてテストすることも可能ですが、今回実装クラスが 2 つ

元記事を表示

JavaのGCに関するオプション

## -XX:+PrintGCInitial -XX:+PrintFlagsFinal
すべてのGCのオプション設定を出力します。
## -XX:+PrintGCDetails
すべてのGCで詳細メッセージの出力を有効にします。
## 実装確認
サンプルコード
“`java
public class OOMTest {

public static void main(String[] args) {
int i=0;
List list = new ArrayList<>();
String str = “OOM and GC”;
while(true) {
list.add(str);
str = str + str;
i = i++;
}
}
}
“`
実行オプション
“`
-Xms5m -Xmx5m -XX:+PrintFlagsInitial
“`
実行結果
“`
[Global flags]
intx ActiveProcessorCount

元記事を表示

@Autowired、依存関係注入

– 様々な方法があるが、**生成子注入にするのが一番良い。**
– 生成者がたった1つだけあれば@Autowiredを省略しても自動注入される。

## 使用方法
### 1. 生成子注入
“`java
@Component
public class OrderServiceImpl implements OrderService {

private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
“`
– **最も

元記事を表示

日本語プログラミング言語 Mind Java C# でHello World実行時間を仲良く競う

# はじめに
日本語プログラミング言語 Mind とJava C# とで「Hello World」コンソール出力の反復実行時間を仲良く競い合わせてみます。

## この記事内容の作業環境
Windows11 Pro 22H2
VSCode(Visual Studo Code) 1.78.2
java Eclipse Adoptium jdk-20.0.2.9-hotspot
C# 10 dotnet-sdk-6.0.404-win-x64
Mind Version 8.07 for Windows

## この記事内容の保証
※この記事の実行結果は参考情報です。実行環境に大きく依存します。Mindは現状秒単位で計測していますので誤差があります。

# お題のソースコード
#### Java
“`Java:main.java
import java.lang.System;
/**
* プログラム型
*/
class Program
{
/**
* メイン
* @param args 引数
*/
public static void main(

元記事を表示

【学習メモ】SQS拡張クライアントライブラリとは

# SQS拡張クライアントライブラリとは
・通常のSQSキューのデータサーズ制限は**256KB**だが、運用上それを超えたい場合の対応法である

・大量のAmazon SQSメッセージを管理するには、Amazon S3とJava 用SQS拡張クライアントライブラリを使用することで、**2GB**までのサイズのメッセージを保存および処理ができるようになる
 →AWS Java SDKが必要(プログラミングを作る必要がある)

・イメージとして、メッセージの保管場所を本来の狭いパイプ(SQSキュー)から広い貯水槽(S3)に変える
 →常にS3に保存するか、サイズが256KBを超える場合のみ保存するかを指定できる

# 参考サイト
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-s3-messages.html

https://zenn.dev/hi_ka_ru/articles/a516af8bfc4457

元記事を表示

javaのTLAB,jps,jstat,jinfoについて

## TLAB
Javaの小さなオブジェクトは、TLAB (Thread Local Area Buffer)に割り当てられます。TLABは、新しいオブジェクトが割り当てられている小さなメモリー領域です。TLABが一杯になると、スレッドが新しいものを取得します。
## jps
jps ツールは、ターゲットシステム上で計測された HotSpot Java 仮想マシン (JVM) を一覧表示します。このツールで表示できるレポート情報は、アクセス権を持った JVM に関するものに限定されます。
## jstat
jstatコマンドは、設置されているJava HotSpot VMのパフォーマンス統計情報を表示します。 ターゲットJVMは、仮想マシン識別子またはvmidオプションによって識別されます。
## jinfo
指定されたJavaプロセスに関するJava構成情報を出力します。 構成情報は、Javaシステム・プロパティとJVMコマンド行フラグで構成されます。
## 実装確認
サンプルコード
“`java
public class TLABTest {

public static v

元記事を表示

形式記述言語VDM++の制御構文(call文)をJava C# Re:Mind(自作言語)と比較

# はじめに
要求仕様記述段階での使用が主に想定されている数学的形式手法VDM(Vienna Development Method)[^1]のオブジェクト指向拡張言語VDM++ですが、ロジックの実装も記述できる構文が用意されています。本記事ではVDM++の制御構文(call文)をJavaとC#そして自作言語のRe:Mind[^2] と比較してみます。

## この記事内容の作業目的
VDM++の下記の制御構文[^3][^4]についていくつかの記事に分割して比較検討します。クラスの定義構文についてはこちらの記事[^5]を参照することができます。

・ブロック文
・コメント文
・代入文
・条件文
・ループ文
・**call文** ←本記事対象
・return文
・例外

VDM++はオブジェクト指向言語的な言語要素を持ち、数学的形式手法言語の中では一般のプログラミング言語のオブジェクト指向言語に近い面があります。また、VDMのような数学的形式手法を使わない場合は、一般的に自然言語の日本語で要求仕様が記述されているものと推察されます。本記事では数学的形式手法と自然言語の日本語記述とのはざまで

元記事を表示

形式記述言語VDM++の制御構文(代入文)をJava C# Re:Mind(自作言語)と比較

# はじめに
要求仕様記述段階での使用が主に想定されている数学的形式手法VDM(Vienna Development Method)[^1]のオブジェクト指向拡張言語VDM++ですが、ロジックの実装も記述できる構文が用意されています。本記事ではVDM++の制御構文(代入文)をJavaとC#そして自作言語のRe:Mind[^2] と比較してみます。

## この記事内容の作業目的
VDM++の下記の制御構文[^3][^4]についていくつかの記事に分割して比較検討します。クラスの定義構文についてはこちらの記事[^5]を参照することができます。

・ブロック文
・コメント文
・**代入文** ←本記事対象
・条件文
・ループ文
・call文
・return文
・例外

VDM++はオブジェクト指向言語的な言語要素を持ち、数学的形式手法言語の中では一般のプログラミング言語のオブジェクト指向言語に近い面があります。また、VDMのような数学的形式手法を使わない場合は、一般的に自然言語の日本語で要求仕様が記述されているものと推察されます。本記事では数学的形式手法と自然言語の日本語記述とのはざまで、構

元記事を表示

デザインパターン Proxyパターン

# Proxyパターン
特定のオブジェクトに対するアクセスや操作を、Proxy(代理)オブジェクトを介して行う方法。

Decorator パターンに似ている。

Decorator パターンが、既存のオブジェクトに対して透過的に新たな振る舞い、責務を追加することを目的としているのに対して、Proxy パターンは**アクセス制御を主な目的としている**。

また、Decorartor パターンではオブジェクトが何重にもラップされることがあるのに対して、Proxy パターンでは通常オブジェクトが何重にも重ねてラップされることはない。

ただし、Proxy パターンは、アクセス制御以外にも様々な目的で利用できる。

## 利用場面

#### アクセス制御・保護プロキシ
アクセス制御や権限管理に利用される。
Proxy を介入させることで、特定のユーザーに対してのみアクセスを許可し、他のユーザーからのアクセスに制限をかけることができる。

#### リモートアクセス制御・リモートプロキシ
Proxy が(リモート)サーバー上に存在するオブジェクトにアクセスするための手段として利用される。

元記事を表示

android studio 覚書 (お題 2:スレッド処理の実装)

## お題 2:スレッド処理の実装

### 2-1. イメージ

下記のように、ボタンを押すと時刻が更新される画面を実装する。
この時、画面が操作不能にならないこと。
![Test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723869/f927f5e4-b38a-c48f-0fc0-584870248c00.gif)

### 2-2. 実装
実装したコードは下記の通り。

“`java:全容
package com.example.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Looper;
import android.os.Handler;

import android.view.View;
import android.widget.Button;
import android.widget.TextVie

元記事を表示

AOJ ITP1 8-C Counting Characters

これは、文字列を受け取ろうとしたら複数行で来ることもあるといわれてわからず詰んだ。
終了条件がわからないと8-Bのように0の時breakするみたいなこともできない。
単体だったら、受け取った文字列を順番に確認していけばよさそう。…aからzの確認ってどうやるんだ。
これまでの感じだと、char型を利用するのかな。for文をint i=0で回して+97すればアルファベットになる?
でも、その前の受け取りがわからないので、すぐに回答を見た。

# 回答
~~~java:Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] alf = new int[26];
while (scan.hasNext()) {
String str = scan.next().toLowerCase();
for (int i=0;i

元記事を表示

AOJ ITP1 8-B Sum of Numbers

8-Aで文字列をバラバラにした次は数値をバラバラにする問題だった。
バラバラにした各桁を足し合わせて表示する。
chatAtを使おうと思ったけど、数値型で受け取っているせいでうまくいかなかった。
回答を参考にして作り直した。
~~~java:Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (true) {
int sum = 0;
String num = scan.nextLine();
if (num.equals(“0”)) break;
int numLen = String.valueOf(num).length();
for (int i=0;i

元記事を表示

android studio 覚書 (お題 1:ボタンを押してテキストを更新する)

## お題 1:ボタンを押してテキストを更新する

### 1-1. イメージ

下記のような画面を実装する。

ボタン押下前
![スクリーンショット 2023-11-18 203537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723869/38afe4b7-8f35-a5a6-ba75-ab7c9a1c2a60.png)

ボタン押下後
![スクリーンショット 2023-11-18 203600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723869/eaf14ee9-8385-2139-006e-af87f23dafb8.png)

### 1-2. 実装
実装したコードは下記の通り。
MVC ModelのC(Controller)に該当する部分?
V(View)はxmlファイルの画面定義、M(Model)は…?

“`java
package com.example.helloworl

元記事を表示

形式記述言語VDM++の制御構文(return文)をJava C# Re:Mind(自作言語)と比較

# はじめに
要求仕様記述段階での使用が主に想定されている数学的形式手法VDM(Vienna Development Method)[^1]のオブジェクト指向拡張言語VDM++ですが、ロジックの実装も記述できる構文が用意されています。本記事ではVDM++の制御構文(return文)をJavaとC#そして自作言語のRe:Mind[^2] と比較してみます。

## この記事内容の作業目的
VDM++の下記の制御構文[^3][^4]についていくつかの記事に分割して比較検討します。クラスの定義構文についてはこちらの記事[^5]を参照することができます。

・ブロック文
・コメント文
・代入文
・条件文
・ループ文
・call文
・**return文** ←本記事対象
・例外

VDM++はオブジェクト指向言語的な言語要素を持ち、数学的形式手法言語の中では一般のプログラミング言語のオブジェクト指向言語に近い面があります。

Re:MindはJavaやC#の経験者向けに設計された日本語プログラミング言語の一種で、ロジック仕様記述言語とトランスコンパイラ言語とで言語仕様を共有しています。

VDM

元記事を表示

形式記述言語VDM++の制御構文(cases文)をJava C# Re:Mindの(switch文)と比較

# はじめに
要求仕様記述段階での使用が主に想定されている数学的形式手法VDM(Vienna Development Method)[^1]のオブジェクト指向拡張言語VDM++ですが、ロジックの実装も記述できる構文が用意されています。本記事ではVDM++の制御構文(cases文)をJavaとC#そして自作言語のRe:Mind[^2] (switch文)と比較してみます。

## この記事内容の作業目的
VDM++の下記の制御構文[^3][^4]についていくつかの記事に分割して比較検討します。

・ブロック文
・代入文
・**条件文** ←本記事対象
・ループ文
・call文
・return文
・コメント文
・例外

VDM++はオブジェクト指向言語的な言語要素を持ち、数学的形式手法言語の中では一般のプログラミング言語のオブジェクト指向言語に近い面がありますが、かなり別物という面もあります。また、VDMのような数学的形式手法を使わない場合は、一般的に自然言語の日本語で要求仕様が記述されているものと推察されます。本記事では数学的形式手法と自然言語の日本語記述とのはざまで、構造化された日本語

元記事を表示

レコードとかswitch式とかパターンマッチとかテキストブロックとかその辺のまとめ

Java 11 から Java 21 までの間に追加された以下の言語仕様について、一通り正式採用されたっぽくて LTS も出たので整理する。

– switch式
– テキストブロック
– Pattern Matching for instanceof
– レコードクラス
– シールクラス
– レコードパターン
– Pattern Matching for switch

# 環境
“`text
> java –version
openjdk 21.0.1 2023-10-17 LTS
OpenJDK Runtime Environment Temurin-21.0.1+12 (build 21.0.1+12-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.1+12 (build 21.0.1+12-LTS, mixed mode, sharing)
“`

# 各言語仕様の正式採用バージョン整理

|バージョン|正式採用された言語仕様|
|———|——-|
|11 | |
|12 | |
|13 | |
|14 |swi

元記事を表示

Spring ContainerにSpring Beanを手動で登録する方法(@Bean)

1. AppConfig.javaに @Configuration, @Bean annotationをつける。
“`jsx
package hello.hellospring;

@Configuration
public class AppConfig {

@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}

@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}

@Bean
public MemberRepository member

元記事を表示

WebClientを用いての外部APIの呼び出し方

Java SpringBoot内でのWebClientを用いての外部APIの呼び出し方

※共通は各通信の場合で呼ばれているメソッド

(共通)
“`java:WebClientInfo.java
public WebClient webClient;

public WebClientInfo(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl(“http://localhost:8082”).build();
}
“`

## (GET通信の場合) ※クエリパラメータ方式の場合
“`java:WebClientInfo.java

public 【戻りの型】 メソッド名(値1, 値2) {
return this.webClient.get()
.uri(uriBuilder -> uriBuilder
.path(“/【UR

元記事を表示

javaガベージ・コレクタとOutOfMemoryError

## ヒープ領域とは
JVMがプログラム実行時に確保するメモリ領域のうち、実行時に生成するオブジェクトのために割り当てられる領域をヒープ領域といいます。
## ガベージ・コレクタとは
ガベージ・コレクタ(GC)は、アプリケーションの動的メモリー割当てリクエストを自動的に管理します。
Java HotSpotガベージ・コレクションでは、様々な技術を採用して、これらの操作の効率性を改善します。
– 世代別のスカベンジをエージングとともに使用して、再利用可能で大きなメモリー領域が含まれている可能性のあるヒープ内の領域に集中します。
– 複数のスレッドを使用して、並列操作をアグレッシブに実行するか、アプリケーションと同時にバックグラウンドで長時間かかる操作を実行します。
– ライブ・オブジェクトを圧縮することで、連続的な大きな空きメモリーのリカバリを試行します。
## OutOfMemoryError
メモリー不足のためにJava Virtual Machineがオブジェクトを割り当てることができず、ガベージ・コレクタによっても使用可能なメモリーをこれ以上確保できない場合にスローされます。まる

元記事を表示

OTHERカテゴリの最新記事