システム「Thanos」 - Java 仮想マシン

システム「Thanos」 - Java 仮想マシン

[[328776]]

コンセプト

仮想マシン: 完全なハードウェア システム機能をシミュレートし、完全に分離された環境でソフトウェア方式で実行される完全なコンピュータ システムを指します。これは物理マシンのソフトウェア実装です。一般的に使用される仮想マシンには、VMWare、Visual Box、Java 仮想マシン (Java 仮想マシン、略して JVM) などがあります。

Java 仮想マシン キャンプ: Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM…

プロセスを開始する

基本的なアーキテクチャ

Java ランタイムはソース コード (.java) をバイトコードにコンパイルし、それが jre によって実行されます。 jre は Java 仮想マシン (jvm) によって実装されます。 Jvm はバイトコードを分析し、解釈して実行します。

JVM は 3 つの主要なサブシステムで構成されています。

1. クラスローダーサブシステム

2. ランタイムデータ領域(メモリ)

3. 実行エンジン

クラスローダーサブシステム

クラスのロードには、ロード、接続 (検証、準備、解析 (オプション))、および初期化が含まれます。クラスのロード作業は、ClassLoader とそのサブクラスが担当します。

ロード: ハードディスク上のバイトコードファイルを探し、IOを介して読み取る

接続: 検証、準備、解析(オプション)の手順を実行します

検証、バイトコードファイルの正確性を検証する

クラスの静的変数にメモリを割り当て、デフォルト値を割り当てる準備をする

解析し、シンボリック参照を直接参照に変換し、クラスによって参照される他のすべてのクラスをクラスローダーにロードします。

初期化:クラスの静的変数を指定された値に初期化し、静的コードブロックを実行します。

クラスローダーアーキテクチャ

1. クラス ローダーを起動します。これは、jre ターゲットの下にある rt.jar、charsets.jar などの JRE のコア クラス ライブラリをロードする役割を担います。

2. 拡張クラスローダー: JRE拡張ディレクトリextにJARクラスパッケージをロードする役割を担う。

3. システムクラスローダー: ClassPathパスの下のクラスパッケージをロードする役割を担う

4. ユーザー定義ローダー: ユーザー定義パスのクラスパッケージをロードする役割を担う

クラスローディングメカニズム(親委任)

委任メカニズムの全体的な責任。 ClassLoader がクラスをロードする場合、別の ClassLoader が明示的に使用されない限り、そのクラスが依存および参照するクラスもこの ClassLoader によってロードされます。委任メカニズム: 最初に親クラスローダーにターゲットクラスの検索を委託し、ターゲットクラスが見つからない場合は、独自のパスでターゲットクラスを検索してロードすることを意味します。

ランタイムデータ領域

ヒープ(Javaヒープ)

仮想マシンの起動時に作成され、オブジェクト インスタンスを格納するために使用されます。ほぼすべてのオブジェクト (定数プールを含む) はヒープ上にメモリを割り当てます。オブジェクトがこのスペースのメモリを適用できない場合、OutOfMemoryError 例外がスローされます。ガベージコレクターが管理する主なエリアでもあります。 -Xmx および -Xms パラメータを使用して、最大ヒープ サイズと最小ヒープ サイズを指定できます。スレッドの共有。

スタック(Javaスタック)

Java メソッド実行のメモリ モデルです。仮想マシンが Java メソッドを実行すると、実行中に各メソッドに対してスタック フレームが作成されます (ローカル変数テーブル、オペランド スタック、動的リンク、メソッド終了などの情報を格納するために使用されます)。スレッド限定。

Jvm はこの領域に対して 2 つの例外を指定します。

1. スレッドによって要求されたスタックの深さが仮想マシン スタックで許可されている深さよりも大きい場合、StackOverFlowError 例外がスローされます。

2. 仮想マシン スタックを動的に拡張できる場合、要求できるメモリ領域が不足すると OutOfMemoryError がスローされます。スタック スペースは jvm パラメーター –Xss によって指定され、スペースのサイズによって関数呼び出しの深さが決まります。

ネイティブメソッドスタック

仮想マシンのネイティブ メソッドを実行します。その他の仕様は Java スタックと同様です。この領域では、さまざまな種類の仮想マシンを自由に実装できます。スレッド限定。

PCレジスタ(プログラムカウンタ)

実行される命令のアドレスを格納するために使用されます。分岐、ループ、ジャンプ、例外処理、スレッド回復などの機能はすべて、pc レジスタに依存します。スレッド限定。

スレッドが Java メソッドを実行する場合、pc レジスタには実行される命令のアドレスが格納されます。ネイティブ メソッドが実行されると、pc レジスタは空になります。

メタデータ領域

メタデータ領域は永続世代に代わるもので、本質的には永続世代に似ています。どちらも、JVM 仕様のメソッド領域の実装です。違いは、メタデータ領域が仮想マシン内になく、ローカルメモリを使用することです。メタデータ領域が頻繁に使用されると、OutOfMemory 例外が発生する可能性があります。

メタデータ領域の動的な拡張。デフォルトの –XX:MetaspaceSize 値は、最高水準点の 21 MB です。一度触れると、Full GC がトリガーされ、役に立たないクラスがアンロードされ (クラスに対応するクラス ローダーが動作しなくなります)、最高水準点がリセットされます。新しい最高水準値は、GC 後に解放されたメタスペースによって異なります。解放されるスペースが少ないと、最高水準点が上昇します。解放されたスペースが多すぎると、最高水準点が下がります。

実行エンジン

実行エンジンはランタイムデータ領域内のバイトコードを読み取り、1つずつ実行します。

(1) インタプリタ: インタプリタはバイトコードをより速く解釈しますが、一度に 1 つの文を解釈して実行するので、実行速度は遅くなります。

(2)JITコンパイラ:JITコンパイラはインタープリタの欠点を解消します。実行エンジンは、インタープリターを介してバイトコードを変換し、繰り返しコードを検出すると、JIT コンパイラを使用してバイトコード全体をコンパイルし、ネイティブ コードに変換します。このネイティブ コードは繰り返しメソッド呼び出しに直接使用され、システムのパフォーマンスが向上します。

JIT のコンポーネントは次のとおりです。

中間コードジェネレーター: 中間コードを生成します。

コード オプティマイザー: 上記で生成された中間コードの最適化を担当します。

ターゲット コード ジェネレーター: マシン コードまたはネイティブ コードの生成を担当します。

プロファイラー: ホットスポット (何度も呼び出されるメソッド) を見つけるための特別なコンポーネント

(3)ガベージコレクター:参照されていないオブジェクトを収集して削除します。プログラムは System.gc() を呼び出してガベージ コレクションをトリガーできますが、必ず実行されるとは限りません。

ネイティブ メソッド インターフェイス (JNI): JNI はネイティブ メソッド ライブラリと対話し、実行エンジンに必要なネイティブ ライブラリを提供します。

ネイティブ メソッド ライブラリ: 実行エンジンに必要なネイティブ ライブラリのコレクション。

ガベージコレクション (GC)

1. ゴミを識別し、リサイクル可能かどうかを判断するにはどうすればよいでしょうか?

参照カウント方式: 各オブジェクトにカウンターを追加します。オブジェクトがどこかで参照されると、カウンターは 1 増加し、参照が無効な場合は、カウンターは 1 減少します。オブジェクト カウンターが 0 かどうかは、オブジェクトがリサイクル可能かどうかを判断するために使用されます。欠点: 循環参照の問題を解決できない

ルート検索アルゴリズム: 到達可能性分析法とも呼ばれ、"GC ROOTs" オブジェクトを検索開始点として使用し、参照を通じて下方向に検索します。通過するパスは参照チェーンと呼ばれます。オブジェクトがリサイクル可能かどうかは、オブジェクトが参照チェーンへのパスを持っているかどうかによって決まります (GC ルートとして使用できるオブジェクト: 仮想マシン スタックで参照されるオブジェクト、メソッド領域内のクラスの静的属性によって参照されるオブジェクト、メソッド領域内の定数によって参照されるオブジェクト、およびローカル メソッド スタック内の JNI によって参照されるオブジェクト)

2. Java のヒープは、GC がガベージを収集する主な領域です。 GC は、マイナー GC とフル GC (またはメジャー GC) の 2 種類に分けられます。

マイナー GC: 若い世代 (Young Gen) のスペースが不足している場合にコレクションがトリガーされます。 Java のほとんどのオブジェクトは通常、長期間存続する必要がないため、若い世代は GC コレクションが頻繁に行われる領域であり、コピー アルゴリズムが使用されます。

フル GC: 旧世代 (Old Gen) のスペースが不足している場合、またはメタスペースが最高水準点に達した場合にコレクションが実行されます。大きなオブジェクトや長期間存続するオブジェクトは大量のメモリ空間を占有し、リサイクル効率が低いため、マークスイープアルゴリズムが使用されます。

GCアルゴリズム

リサイクル戦略に応じて、マークスイープアルゴリズム、マークコンパクトアルゴリズム、コピーアルゴリズムに分けられます。

1. マークアンドスイープアルゴリズム:「マーキング」と「スイープ」の 2 つの段階に分かれています。まず、リサイクル可能なオブジェクトをマークし、マークが完了したら、マークされたすべてのオブジェクトが占めるメモリ領域をリサイクルします。デメリット: 1. 循環参照を処理できない 2. 効率が低い 3. 大量のメモリフラグメントが生成される (追記: スペースの断片化が多すぎると、将来大きなオブジェクトを割り当てるときに十分な連続メモリスペースを適用できなくなり、新しいラウンドの GC が事前にトリガーされる可能性があります)

2. マークソートアルゴリズム:「マーキング」と「ソート」の 2 つの段階に分かれています。まず、リサイクルできるものに印を付けます。マークした後、オブジェクトを一方の端に移動し、境界の外側のメモリを直接クリーンアップします。

3. コピーアルゴリズム: メモリ空間を 2 つの等しい領域に分割し、一度に 1 つの領域のみを使用します。 gc 中、現在使用されている領域が走査され、使用中のオブジェクトが別の領域にコピーされます。このアルゴリズムは、使用中のオブジェクトのみを毎回処理するため、コピーコストは比較的小さくなります。同時に、コピー後にメモリを適切にソートできるため、「断片化」の問題は発生しません。デメリット: 1. メモリ使用率の問題 2. オブジェクトの生存率が高い場合、効率が低くなります。

パーティション処理に応じて、増分コレクションアルゴリズム、世代別コレクションアルゴリズムに分けられます。

1. 増分コレクション: リアルタイム ガベージ コレクション アルゴリズム。つまり、アプリケーションの実行中にガベージ コレクションが実行されます。理論的には、従来の生成方法によって発生する問題を解決できます。増分コレクションは、ヒープ領域を一連のメモリ ブロックに分割します。使用する際は、まず一部から使用してください。ガベージコレクションを行う際は、以前使用されていた部分に残っているオブジェクトを、後ろの未使用のスペースに配置します。これにより、従来の生成方法のように、使用がすべて完了した後にリサイクルのために一時停止する状況を回避し、使用しながら収集する効果が得られます。

2. 世代別コレクション: (商用デフォルト) オブジェクトのライフサイクルに基づいて、新世代、旧世代、メタスペースに分割され、異なるライフサイクルで異なるアルゴリズムを使用してオブジェクトをリサイクルします。

システムスレッドに応じて、シリアルコレクションアルゴリズム、並列コレクションアルゴリズム、同時コレクションアルゴリズムに分類できます。

1. シリアルコレクション: 単一のスレッドを使用してガベージコレクション作業を処理します。実装が簡単で、効率が高くなります。デメリット: 1. 複数のプロセッサを活用できない 2. ユーザースレッドを一時停止する必要がある

2. 並列コレクション: マルチスレッドを使用してガベージ コレクション作業を高速かつ効率的に処理します。理論的には、CPU の数が多いほど、並列コレクターが発揮できる利点は多くなります。デメリット: ユーザースレッドを一時停止する必要がある

3. 同時収集: ガベージ スレッドとユーザー スレッドが同時に動作します。システムはガベージコレクション中にユーザースレッドを一時停止する必要がない

GC コレクター

ガベージ コレクション アルゴリズムはメモリ リサイクルの理論的基礎であり、ガベージ コレクターはメモリ リサイクルの具体的な実装です。

1. シリアルコレクターは主に新世代のコレクションに使用されます。最も基本的かつ最も古いコレクターです。これはシングルスレッドのコレクターであり、作業中はすべてのユーザー スレッドを一時停止する必要があります。このコレクターはコピーアルゴリズムを使用します。

Serial Old コレクターは主に古い世代を収集し、シンプルで効率的ですが一時停止するマークスイープ アルゴリズムを使用します。

2. ParNew コレクターは、Serial のマルチスレッド バージョンです。新しい世代にはコピー アルゴリズムとマルチスレッド ガベージ コレクション (並列コレクター、応答優先度) を使用します。

3. Parallel Scavenge は、新世代のマルチスレッド コレクター (並列コレクター、スループット優先) 用のレプリケーション アルゴリズムを使用します。スループットと一時停止時間を制御できます。つまり、スループット = ユーザー コードの実行時間 / (ユーザー コードの実行時間 + ガベージ コレクション時間) です。

Parallel Old コレクターは、マルチスレッドとマーク アンド スイープ アルゴリズムを使用する Parallel Scavenge コレクター (並列コレクター) の旧世代バージョンです。

4. CMS (Current Mark Sweep) コレクターは、古い世代を対象としています。最短のリカバリ一時停止時間を得ることを目的としたコレクターです。これは、マークスイープ アルゴリズムを使用する並行コレクターです。

5. 新しい世代の G1 は ParNew に似ており、レプリケーション アルゴリズムを使用します。新しい世代の占有率が一定の割合に達すると、収集が始まります。旧世代は CMS に似ていますが、マークスイープ アルゴリズムを使用します。

したがって、G1 は、マルチ CPU およびマルチコア環境を最大限に活用できる並列同時実行コレクターです。また、予測可能な一時停止時間モデルを構築することもできます。

CMS コレクターと比較して、G1 コレクターには次の特性があります。

1. スペース統合: G1 コレクターは、メモリ スペースの断片化を引き起こさないマーク アンド スイープ アルゴリズムを使用します。大きなオブジェクトを割り当てると (Full GC の大きなオーバーヘッドを回避するために古い世代に直接入力せずに、短期間の巨大オブジェクトを格納するために特別に使用される Humongous 領域に直接割り当てる)、連続したスペースを見つけることができないため、次の GC が事前にトリガーされません。 (フル GC は、若い世代のコピー、古い世代の転送オブジェクト用の空きパーティションがない場合、または巨大なオブジェクト用の連続パーティションがない場合にトリガーされます。オーバーヘッドが非常に大きいため、回避する必要があります。)

2. 予測可能な休止。一時停止時間を短縮することは、G1 と CMS の共通の懸念事項です。 G1 は、短い一時停止時間の追求に加えて、予測可能な一時停止時間モデルを確立することもできます。これにより、ユーザーは、ガベージ コレクションに費やされる時間が N ミリ秒の期間内に N ミリ秒を超えてはならないことを明確に指定でき、Java Real-Time System (RTSJ) レベルのガベージ コレクターにほぼ達します。

3. G1 は Java ヒープを同じサイズの複数の独立した領域に分割します。新世代と旧世代の概念は保持されますが、物理的に分離されなくなりました。それらはすべて(おそらく不連続な)領域の集合です。

コレクターの一般的な組み合わせ

JVM パフォーマンス チューニングのアイデア

GCログを理解する

  • [GC [PSYoungGen: 8192K->1000K(9216K)] 16004K->14604K(29696K), 0.0317424 秒] [時間: ユーザー=0.06 システム=0.00、実=0.03 秒]
  • [GC [PSYoungGen: 9192K->1016K(9216K)] 22796K->20780K(29696K), 0.0314567 秒] [時間: ユーザー=0.06 システム=0.00、実=0.03 秒]
  • [フル GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20435K->20435K(20480K)] 28627K->28627K(29696K)、[メタスペース: 8469K->8469K(1056768K)​​]、0.1307495 秒] [時間: ユーザー=0.50、システム=0.00、実=0.13 秒]
  • [フル GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20437K->20437K(20480K)] 28629K->28629K(29696K)、[メタスペース: 8469K->8469K(1056768K)​​]、0.1240311 秒] [時間: ユーザー=0.42、システム=0.00、実=0.12 秒]

一般的な異常

  • StackOverflowError: (スタックオーバーフロー)
  • OutOfMemoryError: Java ヒープ スペース (ヒープ スペースが不足しています)
  • OutOfMemoryError: GC オーバーヘッド制限を超えました (GC に 98% 以上の時間がかかり、GC によって回復されたメモリは 2% 未満でした)

GCパラメータ

スタック設定

  • -Xss: 各スレッドのスタックサイズ
  • -Xms: 初期ヒープサイズ、デフォルトは物理メモリの 1/64
  • -Xmx: 最大ヒープサイズ、デフォルトは物理メモリの 1/4
  • -Xmn: 新世代サイズ
  • -XX:NewSize: 新しい世代の初期サイズを設定します
  • -XX:NewRatio: デフォルト値 2 は、新しい世代が古い世代の 1/2 とヒープ メモリ全体の 1/3 を占めることを意味します。
  • -XX:SurvivorRatio: デフォルト値の 8 は、Survivor 領域が Eden メモリの 1/8、つまり新世代メモリの 1/10 を占めることを意味します。
  • -XX:MaxMetaspaceSize: メタスペースの最大許容サイズを設定します。デフォルトでは無制限であり、JVM メタスペースは動的に拡張されます。

ガベージコレクション統計

  • -XX:+プリントGC
  • -XX:+GC詳細を印刷
  • -XX:+GCタイムスタンプを印刷
  • -Xloggc:ファイル名

コレクター設定

  • -XX:+UseSerialGC: シリアルコレクターを設定する
  • -XX:+UseParallelGC: 並列コレクターを設定する
  • -XX:+UseParallelOldGC: 古い世代の並列リカバリコレクターを使用する
  • -XX:+UseParNewGC: 新しい世代で並列コレクターを使用する
  • -XX:+UseParalledlOldGC: 並列旧世代コレクターを設定する
  • -XX:+UseConcMarkSweepGC: CMS同時コレクターを設定する
  • -XX:+UseG1GC: G1コレクターを設定する
  • -XX:ParallelGCThreads: ガベージコレクションに使用するスレッドの数を設定します

並列コレクター設定

  • -XX:ParallelGCThreads: 収集時に並列コレクターが使用する CPU の数を設定します。並列コレクションスレッドの数。
  • -XX:MaxGCPauseMillis: 並列コレクションの最大一時停止時間を設定します
  • -XX:GCTimeRatio: プログラム実行時間に対するガベージ コレクション時間の割合を設定します。式は1/(1+n)

CMS コレクター設定

  • -XX:+UseConcMarkSweepGC: CMS同時コレクターを設定する
  • -XX:+CMSIncrementalMode: 増分モードに設定します。単一 CPU の状況に適用可能です。
  • -XX:ParallelGCThreads: 同時コレクターの新世代コレクション モードが並列コレクションの場合に使用される CPU の数を設定します。並列コレクションスレッドの数。
  • -XX:CMSFullGCsBeforeCompaction: メモリ圧縮を実行する前に CMS ガベージ コレクションを実行する回数を設定します。
  • -XX:+CMSClassUnloadingEnabled: クラスメタデータのリサイクルを許可します
  • -XX:UseCMSInitiatingOccupancyOnly: しきい値に達した場合にのみ CMS リサイクルが実行されることを示します。
  • -XX:+CMSIncrementalMode: 増分モードに設定します。単一CPUの状況に適用可能
  • -XX:ParallelCMSThreads: CMSスレッドの数を設定する
  • -XX:CMSInitiatingOccupancyFraction: 古い世代のスペースが使用された後に CMS コレクターがトリガーされるように設定します
  • -XX:+
  • UseCMSCompactAtFullCollection: ガベージ コレクションの完了後に CMS コレクターがメモリ断片化のデフラグを実行するかどうかを設定します。

G1コレクター設定

  • -XX:+UseG1GC: G1コレクターを使用する
  • -XX:ParallelGCThreads: GC作業のスレッド数を指定します
  • -XX:G1HeapRegionSize: パーティション サイズを指定します (1MB ~ 32MB、2 の累乗である必要があります)。デフォルトでは、ヒープ全体が 2048 個のパーティションに分割されます。
  • -XX:GCTimeRatio: スループット サイズ、0 から 100 までの整数 (デフォルトは 9)。値が n の場合、システムはガベージ コレクションに 1/(1+n) 時間しか費やしません。
  • -XX:MaxGCPauseMillis: 目標一時停止時間 (デフォルト 200 ミリ秒)
  • -XX:G1NewSizePercent: 新世代メモリの初期サイズ (デフォルトはヒープ全体の 5%)
  • -XX:G1MaxNewSizePercent: 新世代の最大メモリ容量
  • -XX:TargetSurvivorRatio: 生存者の充填容量 (デフォルト 50%)
  • -XX:MaxTenuringThreshold: 最大テンリングしきい値 (デフォルト 15)
  • -XX:InitiatingHeapOccupancyPercen: 古い世代が占有するスペースがヒープ全体のIHOPしきい値(デフォルトでは45%)を超えており、超過した場合は混合コレクションが実行されます。
  • -XX:G1HeapWastePercent: ヒープの無駄の割合 (デフォルト 5%)
  • -XX:G1MixedGCCountTarget: パラメータ混合サイクルの最大合計数 (デフォルト 8)

パフォーマンス分析および監視ツール

  • Jps: 仮想マシンプロセスステータスツール
  • Jstat: 仮想マシン統計監視ツール
  • Jinfo: 仮想マシン構成情報ツール
  • Jmap: メモリ マッピング ツール
  • Jhat: 仮想マシンのヒープダンプスナップショット分析ツール
  • Jstack: スタックトレースツール
  • JConsole: Java 監視および管理コンソール
  • VisualVM: トラブルシューティング ツール

<<:  2020年のビッグニュース!同国はデジタル経済の発展に向けた8つの主要措置を提案し、国家統合ビッグデータセンターの建設を実施する予定である。

>>:  Java バックエンド テクノロジー: Java 仮想マシン スタックの探索

推薦する

ケーススタディ |ホスピタリティ、エネルギー、食品、農業などの業界におけるクラウド移行パスのまとめ(パート 2)

「クラウド+」時代の到来により、クラウド コンピューティングを通じて企業のデジタル変革を実現すること...

onevps: 新規 (Alipay + 中国語ウェブサイト)、香港/シンガポール/日本に 9 つのデータセンター、1Gbps の帯域幅、無制限のトラフィック、月額わずか 4 ドル

OneVPS最新ニュース:中国のユーザーにより良いサービスを提供するために:1.ウェブサイトの支払い...

2017 年ボリュームゲーム購入に関する年次ホワイトペーパー

2017年はゲーム業界の競争が激化した年でした。広告主は大きなプレッシャーを感じており、ユーザー獲得...

eleven2-米国独立記念日/50% オフ/仮想ホスト/リセラー/VPS

米国の独立記念日が近づいています。eleven2.com では 50% 割引のプロモーションを実施し...

クールなサイト評価: ダークなウェブサイトデザイン 22 選

ウェブサイトのデザインでは明るい色が主流ですが、ミステリアスな雰囲気を際立たせ、控えめな高級感を醸し...

ロサンゼルスの高品質ブロードバンドルート向けクラウドサーバー「ceraus」の簡単なレビュー

cerausの米国クラウドサーバーには、ceraデータセンターのほかに、enzuデータセンターもあり...

yourlasthost-15USD/年/512MB RAM/15GB HDD/1TB Flow/フロリダ

yourlasthost.com は、最近設立された新しいホスティング オペレータです。同社の事業に...

レシピウェブサイトのコンテンツを作成するいくつかの方法についてお話ししましょう

レシピ ウェブサイトのコンテンツを最新かつ優れたものにするにはどうすればよいでしょうか。著者は、ウェ...

tmthosting: シアトルの高セキュリティ VPS、年間 29 ドル、Windows システム、IPv6 サポート

tmthosting のシアトル VPS が 55% オフで販売されています。データ センターは米国...

2020 年に注目すべき 5 つのエッジ コンピューティング統計

モノのインターネット (IoT) デバイスと 5G テクノロジーが普及するにつれて、多くの企業がネッ...

2019年のアプリプロモーションチャネルを総まとめ!

パフォーマンスマーケティング当社では、KPI と結果重視のあらゆるプロモーションを「モバイル インタ...

BuyVMはどうですか?ルクセンブルクVPSの簡単なレビューを見てみましょう

buyvm のルクセンブルク VPS がなぜ人気があるのでしょうか? buyvm はカナダの会社であ...

ウクライナのビジネス紹介: ukrnames、VPS+専用サーバー

ukrnames は 2007 年に設立され、2008 年に ICANN 認定を取得しました。同社の...