国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&面接の質(zhì)問(wèn) Java gc 面接の質(zhì)問(wèn)と回答 (質(zhì)問(wèn) 1 ~ 5)

Java gc 面接の質(zhì)問(wèn)と回答 (質(zhì)問(wèn) 1 ~ 5)

Nov 16, 2019 pm 04:06 PM
java

Java gc 面接の質(zhì)問(wèn)と回答 (質(zhì)問(wèn) 1 ~ 5)

1. GC メカニズムがあるのに、なぜ依然としてメモリ リークが発生するのでしょうか?

理論的には、Java にはガベージ コレクション メカニズム (GC) があります。 ) メモリ リークの問(wèn)題は発生しません (これは、Java がサーバーサイド プログラミングで広く使用されている重要な理由でもあります)。ただし、実際の開(kāi)発では、GC でリサイクルできない、役に立たないが到達(dá)可能なオブジェクトが存在し、メモリ リークが発生する可能性があります。

たとえば、Hibernate のセッション (1 次キャッシュ) 內(nèi)のオブジェクトは永続的であり、ガベージ コレクターはこれらのオブジェクトをリサイクルしません。ただし、これらのオブジェクトには不要なガベージ オブジェクトが存在する可能性があります。閉じられていない場(chǎng)合は、時(shí)間が経つと (close )、1 次キャッシュをフラッシュするとメモリ リークが発生する可能性があります。

次の例のコードでもメモリ リークが発生します。

import java.util.Arrays;
import java.util.EmptyStackException;
public class MyStack<T> {
    private T[] elements;
    private int size = 0;
    private static final int INIT_CAPACITY = 16;
    public MyStack() {
        elements = (T[]) new Object[INIT_CAPACITY];
    }
    public void push(T elem) {
        ensureCapacity();
        elements[size++] = elem;
    }
    public T pop() {
        if (size == 0) throw new EmptyStackException();
        return elements[--size];
    }
    private void ensureCapacity() {
        if (elements.length == size) {
            elements = Arrays.copyOf(elements,2 * size + 1);
        }
    }
}

上記のコードは、スタック (先入れ後出し (FILO)) 構(gòu)造を?qū)g裝しています。一見(jiàn)すると、明らかな問(wèn)題がないように見(jiàn)えます。作成したさまざまな単體テストにも合格できます。

ただし、pop メソッドにはメモリ リークの問(wèn)題があり、pop メソッドを使用してオブジェクトをスタックにポップすると、スタックを使用するプログラムがなくなっても、オブジェクトはガベージ コレクションとして扱われません。は、これらのオブジェクトを參照します。これは、これらのオブジェクトへの古い參照が內(nèi)部的にスタックに保持されているためです。ガベージ コレクションをサポートする言語(yǔ)では、メモリ リークは非常に隠されていますが、この種のメモリ リークは実際には無(wú)意識(shí)のオブジェクト保持です。

オブジェクト參照が無(wú)意識(shí)に保持されている場(chǎng)合、ガベージ コレクターはこのオブジェクトを処理せず、このオブジェクトによって參照される他のオブジェクトも処理しません。そのようなオブジェクトが少數(shù)しか存在しない場(chǎng)合でも、結(jié)果として、多くのオブジェクトがガベージ コレクションから除外されるため、パフォーマンスに重大な影響があり、極端な場(chǎng)合には、ディスク ページング (物理メモリとハード ディスクの仮想メモリ間でのデータ交換) が発生したり、OutOfMemoryError が発生したりする可能性があります。

2. Java に GC メカニズムがあるのはなぜですか?

·安全性への配慮; -- セキュリティのため。

·メモリ リークの削減; -- メモリ リークをある程度消去します。

·プログラマの作業(yè)量を削減します。 --プログラマーはメモリの解放について心配する必要はありません。

3. Java の GC のためにどのメモリをリサイクルする必要がありますか?

メモリが実行されている場(chǎng)合、JVM にはメモリを管理するためのランタイム データ領(lǐng)域があります。

主に 5 つの部分で構(gòu)成されています:

プログラム CounterRegister;

仮想マシン スタック (VM スタック);

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

メソッド領(lǐng)域;

ヒープ。

プログラム カウンタ、仮想マシン スタック、およびローカル メソッド スタックは、各スレッドのプライベート メモリ空間であり、スレッドとともに生まれ、消滅します。例えば、スタック內(nèi)の各スタックフレームにどのくらいのメモリが割り當(dāng)てられているかは、基本的にクラス構(gòu)成が決まれば分かるので、これら3つの領(lǐng)域のメモリ割り當(dāng)てや再利用も決まり、メモリの問(wèn)題を考慮する必要はありません。リサイクル。

しかし、メソッド領(lǐng)域とヒープは異なります。インターフェイスの複數(shù)の実裝クラスは、異なるメモリを必要とする場(chǎng)合があります。どのオブジェクトが作成されるかは、プログラムの実行中にのみわかります。この部分の割り當(dāng)てとリサイクルメモリのこれらはすべて動(dòng)的であり、GC は主にメモリのこの部分に焦點(diǎn)を當(dāng)てます。全體として、GC が主に再利用するメモリは、JVM のメソッド領(lǐng)域とヒープです。

4. Java の GC はいつガベージを収集しますか?

インタビューでは、よくこのような質(zhì)問(wèn)に遭遇します(実際、著者も遭遇しました):物體が死んだことをどのように判斷するか?

考えられる簡(jiǎn)単な答えは、オブジェクトに參照カウンタを追加することです。參照があると常にカウンタ値が 1 増加し、參照が期限切れになるとカウンタ値が 1 減少します。カウンタ値が 0 の場(chǎng)合、オブジェクトは使用されなくなり、死んでいると判斷されます。シンプルで直感的ではないでしょうか?

しかし、殘念です。このアプローチは間違っています!なぜ間違っているのでしょうか?実際、參照カウントを使用することはほとんどの場(chǎng)合に優(yōu)れた解決策であり、実際のアプリケーションでも多くのケースがありますが、オブジェクト間の循環(huán)參照の問(wèn)題は解決できません。

たとえば、オブジェクト A にはオブジェクト B を指すフィールドがあり、オブジェクト B にはオブジェクト A を指すフィールドがあります。実際、どちらも現(xiàn)在は使用されていませんが、値カウンタの値が 0 になることはありません。リサイクルされず、メモリ リークが発生します。

正しいアプローチは何でしょうか?

Java や C# などの言語(yǔ)では、オブジェクトの死を判斷するためのより主流の方法は、到達(dá)可能性分析です。生成されたすべてのオブジェクトは、「GC ルート」「ルートのサブツリー」と呼ばれます。 。

GC ルートから開(kāi)始して、下方向に検索します。検索によって移動(dòng)されるパスは參照チェーンと呼ばれます。オブジェクトに GC ルートに到達(dá)する?yún)⒄榨隶З`ンがない場(chǎng)合、オブジェクトは到達(dá)不能であると言われます。(非-參照可能)、つまり、GC によってリサイクルできます。

參照カウンターであれ、到達(dá)可能性分析であれ、オブジェクトが生きているかどうかの判斷は參照に関連しています。では、オブジェクトへの參照を定義するにはどうすればよいでしょうか?

我們希望給出這樣一類描述:當(dāng)內(nèi)存空間還夠時(shí),能夠保存在內(nèi)存中;如果進(jìn)行了垃圾回收之后內(nèi)存空間仍舊非常緊張,則可以拋棄這些對(duì)象。所以根據(jù)不同的需求,給出如下四種引用,根據(jù)引用類型的不同,GC回收時(shí)也會(huì)有不同的操作:

強(qiáng)引用(Strong Reference):Object obj=new Object();只要強(qiáng)引用還存在,GC永遠(yuǎn)不會(huì)回收掉被引用的對(duì)象。

軟引用(Soft Reference):描述一些還有用但非必需的對(duì)象。在系統(tǒng)將會(huì)發(fā)生內(nèi)存溢出之前,會(huì)把這些對(duì)象列入回收范圍進(jìn)行二次回收(即系統(tǒng)將會(huì)發(fā)生內(nèi)存溢出了,才會(huì)對(duì)他們進(jìn)行回收)

弱引用(Weak Reference):程度比軟引用還要弱一些。這些對(duì)象只能生存到下次GC之前。當(dāng)GC工作時(shí),無(wú)論內(nèi)存是否足夠都會(huì)將其回收(即只要進(jìn)行GC,就會(huì)對(duì)他們進(jìn)行回收。)

虛引用(Phantom Reference):一個(gè)對(duì)象是否存在虛引用,完全不會(huì)對(duì)其生存時(shí)間構(gòu)成影響。關(guān)于方法區(qū)中需要回收的是一些廢棄的常量和無(wú)用的類。

1.廢棄的常量的回收。這里看引用計(jì)數(shù)就可以了。沒(méi)有對(duì)象引用該常量就可以放心的回收了。

2.無(wú)用的類的回收。什么是無(wú)用的類呢?

A.該類所有的實(shí)例都已經(jīng)被回收。也就是Java堆中不存在該類的任何實(shí)例;

B加載該類的ClassLoader已經(jīng)被回收;

C.該類對(duì)應(yīng)的java.lang.Class對(duì)象沒(méi)有任何地方被引用,無(wú)法在任何地方通過(guò)反射訪問(wèn)該類的方法。

總而言之:對(duì)于堆中的對(duì)象,主要用可達(dá)性分析判斷一個(gè)對(duì)象是否還存在引用,如果該對(duì)象沒(méi)有任何引用就應(yīng)該被回收。而根據(jù)我們實(shí)際對(duì)引用的不同需求,又分成了4種引用,每種引用的回收機(jī)制也是不同的。

對(duì)于方法區(qū)中的常量和類,當(dāng)一個(gè)常量沒(méi)有任何對(duì)象引用它,它就可以被回收了。而對(duì)于類,如果可以判定它為無(wú)用類,就可以被回收了。

5、通過(guò)10個(gè)示例來(lái)初步認(rèn)識(shí)Java8中的lambda表達(dá)式

用lambda表達(dá)式實(shí)現(xiàn)Runnable

// Java 8 之前:
new Thread(new Runnable(){
    @Override
    public void run(){
        System.out.println("Before Java8, too much code for too little to do");
    }}).start();
    //Java 8 方式:
    new Thread(()->System.out.println("In Java8, Lambda expression rocks !!")).start();

輸出:

too much code,for too little to do
Lambda expression rocks!!

這個(gè)例子向我們展示了Java 8 lambda表達(dá)式的語(yǔ)法。你可以使用lambda寫出如下代碼:

(params) -> expression (params) -> statement
(params) -> { statements }

例如,如果你的方法不對(duì)參數(shù)進(jìn)行修改、重寫,只是在控制臺(tái)打印點(diǎn)東西的話,那么可以這樣寫:

() -> System.out.println("Hello Lambda Expressions");

如果你的方法接收兩個(gè)參數(shù),那么可以寫成如下這樣:

(int even, int odd) -> even + odd

順便提一句,通常都會(huì)把lambda表達(dá)式內(nèi)部變量的名字起得短一些。這樣能使代碼更簡(jiǎn)短,放在同一行。所以,在上述代碼中,變量名選用a、b或者x、y會(huì)比even、odd要好。

使用Java 8 lambda表達(dá)式進(jìn)行事件處理

如果你用過(guò)Swing API編程,你就會(huì)記得怎樣寫事件監(jiān)聽(tīng)代碼。這又是一個(gè)舊版本簡(jiǎn)單匿名類的經(jīng)典用例,但現(xiàn)在可以不這樣了。你可以用lambda表達(dá)式寫出更好的事件監(jiān)聽(tīng)代碼,如下所示:

// Java 8 之前:
JButton show = new JButton("Show"); show.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Event handling without lambda expression is boring");
    }
});
// Java 8 方式:
show.addActionListener((e) -> {
    System.out.println("Light, Camera, Action !! Lambda expressions Rocks");
});

使用Java 8 lambda表達(dá)式進(jìn)行事件處理 使用lambda表達(dá)式對(duì)列表進(jìn)行迭代

如果你使過(guò)幾年Java,你就知道針對(duì)集合類,最常見(jiàn)的操作就是進(jìn)行迭代,并將業(yè)務(wù)邏輯應(yīng)用于各個(gè)元素,例如處理訂單、交易和事件的列表。

由于Java是命令式語(yǔ)言,Java 8之前的所有循環(huán)代碼都是順序的,即可以對(duì)其元素進(jìn)行并行化處理。如果你想做并行過(guò)濾,就需要自己寫代碼,這并不是那么容易。

通過(guò)引入lambda表達(dá)式和默認(rèn)方法,將做什么和怎么做的問(wèn)題分開(kāi)了,這意味著Java集合現(xiàn)在知道怎樣做迭代,并可以在API層面對(duì)集合元素進(jìn)行并行處理。

下面的例子里,我將介紹如何在使用lambda或不使用lambda表達(dá)式的情況下迭代列表。你可以看到列表現(xiàn)在有了一個(gè)forEach()方法,它可以迭代所有對(duì)象,并將你的lambda代碼應(yīng)用在其中。

// Java 8 之前:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API","Date and Time API");
for (String feature : features) {
    System.out.println(feature);
}
// Java 8 之后:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API","Date and Time API");
features.forEach(n -> System.out.println(n));
// 使用 Java 8 的方法引用更方便,方法引用由::雙冒號(hào)操作符標(biāo)示,
// 看起來(lái)像 C++的作用域解析運(yùn)算符
features.forEach(System.out::println);

輸出:

Lambdas Default Method Stream API
Date and Time API

列表循環(huán)的最后一個(gè)例子展示了如何在Java 8中使用方法引用(method reference)。你可以看到C++里面的雙冒號(hào)、范圍解析操作符現(xiàn)在在Java 8中用來(lái)表示方法引用。

使用lambda表達(dá)式和函數(shù)式接口Predicate

除了在語(yǔ)言層面支持函數(shù)式編程風(fēng)格,Java 8也添加了一個(gè)包,叫做java.util.function。它包含了很多類,用來(lái)支持Java的函數(shù)式編程。其中一個(gè)便是Predicate,使用java.util.function.Predicate函數(shù)式接口以及l(fā)ambda表達(dá)式,可以向API方法添加邏輯,用更少的代碼支持更多的動(dòng)態(tài)行為。下面是Java 8 Predicate的例子,展示了過(guò)濾集合數(shù)據(jù)的多種常用方法。Predicate接口非常適用于做過(guò)濾。

public static void main(String[]args){
    List languages=Arrays.asList("Java", "Scala","C++", "Haskell", "Lisp");
    System.out.println("Languages which starts with J :");
    filter(languages, (str)->str.startsWith("J"));
    System.out.println("Languages which ends with a ");
    filter(languages, (str)->str.endsWith("a"));
    System.out.println("Print all languages :");
    filter(languages, (str)->true);
    System.out.println("Print no language : ");
    filter(languages, (str)->false);
    System.out.println("Print language whose length greater than 4:");
    filter(languages, (str)->str.length()>4);
}
public static void filter(List names, Predicate condition){
    for(String name:names){
        if(condition.test(name)){
            System.out.println(name+" ");
        }
    }
}
// filter 更好的辦法--filter 方法改進(jìn)
public static void filter(List names, Predicate condition) {
    names.stream().filter((name)->(condition.test(name))).forEach((name)->
{System.out.println(name + " ");
    });
}

可以看到,Stream API的過(guò)濾方法也接受一個(gè)Predicate,這意味著可以將我們定制的filter()方法替換成寫在里面的內(nèi)聯(lián)代碼,這就是lambda表達(dá)式的魔力。另外,Predicate接口也允許進(jìn)行多重條件的測(cè)試。

以上がJava gc 面接の質(zhì)問(wèn)と回答 (質(zhì)問(wèn) 1 ~ 5)の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動(dòng)コミットモードをオフにし、次に複數(shù)の操作を?qū)g行し、結(jié)果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開(kāi)始します。 2。挿入や更新など、複數(shù)のSQL操作を?qū)g行します。 3。すべての操作が成功した場(chǎng)合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場(chǎng)合はconn.rollback()を呼び出します。同時(shí)に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設(shè)定して部分的なロールバックを達(dá)成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお?jiǎng)幛幛筏蓼埂?/p>

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時(shí)刻を取得します。 3。of()メソッドを使用して特定の日付と時(shí)刻を作成します。 4.プラス/マイナスメソッドを使用して、時(shí)間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります。現(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

ネットワークポートとファイアウォールの理解 ネットワークポートとファイアウォールの理解 Aug 01, 2025 am 06:40 AM

ネットワークポートアンドファイアワルクトグテルトエナブルコマニケーションwhiledensuringsecurity.1.networksarevirtualendpointsnumbered0–655 35、withwell-knownportslike80(http)、443(https)、22(ssh)、および25(smtp)識(shí)別pecificservices.2.portsoperateovertcp(信頼できる、c

Garbage CollectionはJavaでどのように機(jī)能しますか? Garbage CollectionはJavaでどのように機(jī)能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動(dòng)的に管理するメカニズムであり、到達(dá)不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達(dá)不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達(dá)可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採(cǎi)用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時(shí)間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

ユーザーデータにHTML「入力」タイプを使用します ユーザーデータにHTML「入力」タイプを使用します Aug 03, 2025 am 11:07 AM

適切なHTMLinputタイプを選択すると、データの精度を向上させ、ユーザーエクスペリエンスを向上させ、使いやすさを向上させることができます。 1.テキスト、電子メール、電話、番號(hào)、日付など、データ型に従って対応する入力タイプを選択します。 2。HTML5を使用して、より直感的な相互作用方法を提供できるU(xiǎn)RL、色、範(fàn)囲、検索などの新しいタイプを追加します。 3.プレースホルダーと必要な屬性を使用して、フォームフィリングの効率と精度を改善しますが、プレースホルダーがラベルを置き換えることはできないことに注意してください。

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進(jìn)みます 説明された延期聲明の例で進(jìn)みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時(shí)にすぐに評(píng)価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場(chǎng)合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

See all articles