Letzte Woche ging ein Freund aus der Gruppe zu einem Interview mit Ping An Insurance. Das Ergebnis war etwas bedauerlich, aber ich hoffe, dass Sie sich nicht entmutigen lassen, die Fragen, auf die Sie gestoßen sind im Interview sind im Grunde alle in Ordnung. Sie haben es gelöst, indem Sie die Fragen auf der Rückseite gelesen haben, also geben Sie bitte Ihr Bestes!
Außerdem können Sie bei Fragen gerne zu mir kommen, um gemeinsam zu besprechen und Fortschritte zu erzielen.
Ohne zu weit zu gehen, kommen wir zum Thema. Nachfolgend finden Sie die von diesem Studenten zusammengestellten technischen Interviewfragen und Referenzantworten.
Vector
、Hashtable
、StringBuffer
. Sie alle fügen ihren Methoden Synchronisationssperren hinzu, um Thread-Sicherheit zu erreichen.
Darüber hinaus gibt es alle Sammelklassen im Rahmen des JUC-Pakets
ArrayBlockingQueue
、ConcurrentHashMap
、ConcurrentLinkedQueue
、ConcurrentLinkedDeque
等,这些也是线程安全的。ArrayBlockingQueue
、ConcurrentHashMap
、ConcurrentLinkedQueue
、ConcurrentLinkedDeque
等,这些也是线程安全的。
幸好这么回答就算结束了,面试官也没再问了,不然JUC下的这几个我真回答不上来。
这个问题相对还是简单的,能说上个123应该都没问题了。
Java
Java创建对象有几种方式?
Java中提供了以下四种创建对象的方式:🎜</p> <ul class="list-paddingleft-2" data-tool="mdnice编辑器" style='margin-top: 8px;margin-bottom: 8px;padding-left: 25px;width: 557.438px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;'> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">Neu erstellt ein neues Objekt. </section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section></li>Die Antwort auf diese Frage war nicht sehr gut. Ich erinnerte mich damals nur an String, equal, hashCode, wait, notify und notifyAll. Habe an nichts anderes gedacht. Der Interviewer nickte immer wieder und erweckte den Eindruck, dass alles in Ordnung sein sollte. <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section>java.lang.Object</li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"></section></li> </ul> <h2 data-tool="mdnice编辑器" style='margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 1.3em;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-bottom: 2px solid rgb(239, 112, 96);'>Das Folgende ist die Bedeutung der entsprechenden Methode. <span style="margin-right: 3px;padding: 3px 10px 1px;display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);border-top-right-radius: 3px;border-top-left-radius: 3px;"></span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;">Clone-Methode</span> </h2> <blockquote data-tool="mdnice编辑器" style='margin-top: 20px;margin-bottom: 20px;padding: 10px 10px 10px 20px;border-left-color: rgb(239, 112, 96);color: rgb(106, 115, 125);font-size: 0.9em;text-align: left;white-space: normal;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;border-top: none;border-right: none;border-bottom: none;overflow: auto;background: rgb(255, 249, 249);'> Geschützte Methode zum Implementieren einer flachen Kopie des Objekts. Diese Methode kann nur aufgerufen werden, wenn die Cloneable-Schnittstelle implementiert ist. Andernfalls wird eine CloneNotSupportedException-Ausnahme ausgelöst, die auch Cloneable und sein Mitglied implementieren muss Variablen sind ebenfalls Referenztypen. Sie müssen Cloneable implementieren und dann die Klonmethode überschreiben. <p style="padding-top: 8px;padding-bottom: 8px;font-size: 16px;color: black;line-height: 26px;"></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'><strong>finalize-Methode</strong></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>Diese Methode bezieht sich auf den Garbage Collector. Der letzte Schritt zur Bestimmung, ob ein Objekt recycelt werden kann, besteht darin, festzustellen, ob diese Methode überschrieben wurde. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'><strong>Gleich-Methode</strong></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>Diese Methode wird sehr häufig verwendet. Im Allgemeinen sind equal und == unterschiedlich, aber in Object sind sie gleich. Unterklassen überschreiben diese Methode im Allgemeinen. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'><strong>hashCode-Methode</strong></p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'>Diese Methode wird für die Hash-Suche verwendet. Das Überschreiben der equal-Methode erfordert im Allgemeinen ein Umschreiben der hashCode-Methode. Diese Methode wird in einigen Sammlungen mit Hash-Funktionen verwendet. </p> <p data-tool="mdnice编辑器" style='margin-top: 1px;margin-bottom: 1px;padding-top: 8px;padding-bottom: 8px;text-align: left;white-space: normal;color: black;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;line-height: 26px;'> Muss im Allgemeinen erfüllen <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);'>obj1.equals(obj2)==true。可以推出
obj1.hashCode()==obj2.hashCode()
, aber gleicher HashCode erfüllt nicht unbedingt gleich. Um die Effizienz zu verbessern, sollten die beiden oben genannten Bedingungen jedoch möglichst gleichwertig sein.
JDK 1.6 und 1.7 geben standardmäßig eine Zufallszahl zurück; JDK 1.8 gibt standardmäßig eine Zufallszahl + drei bestimmte Werte in Bezug auf den aktuellen Thread zurück und verwendet den Zufallszahlenalgorithmus des xorshift-Schemas von Marsaglia, um eine Zufallszahl zu erhalten. wait-Methode
wird mit synchronisiert verwendet. Die Wartemethode lässt den aktuellen Thread auf die Sperre des Objekts warten, das heißt, er hat die Sperre des Objekts Objekt. Die Methode wait() wartet, bis sie die Sperre erhält oder unterbrochen wird. wait(long timeout) legt ein Timeout-Intervall fest und kehrt zurück, wenn die Sperre nicht innerhalb der angegebenen Zeit erhalten wird.
Nach dem Aufruf dieser Methode wechselt der aktuelle Thread in den Ruhezustand, bis die folgenden Ereignisse auftreten.
Notify-Methode
Andere Threads rufen die Notify-Methode des Objekts auf; Andere Threads rufen Interrupt auf, um den Thread zu unterbrechen; Das Zeitintervall ist abgelaufen . Zu diesem Zeitpunkt kann der Thread geplant werden. Wenn er unterbrochen wird, wird eine InterruptedException ausgelöst. Die wird in Verbindung mit der Synchronisierung verwendet. Diese Methode weckt einen Thread in der Wartewarteschlange für das Objekt (Threads in der Synchronisationswarteschlange sind für Threads, die die CPU beanspruchen, und Threads in der Warteschleife). Die Warteschlange bezieht sich auf den wartenden, erwachten Thread.
DienotifyAll-Methode
wird mit synchronisiert verwendet. Diese Methode weckt alle Threads, die in der Warteschlange auf dieses Objekt warten.
Welche Beziehung besteht zwischen der HashCode-Methode und der Equals-Methode? Als ich diese Frage stellte, hatte ich das Gefühl, dass der Interviewer an meiner Grundlage zweifelte, aber diese Frage kann immer noch beantwortet werden. Wenn a.equals(b) „true“ zurückgibt, dann ist der
hashCode()
muss gleich sein.Wenn a.equals(b) „false“ zurückgibt, dann ist derhashCode()
kann gleich oder unterschiedlich sein.Die Rolle des Hashcodes
Es ist wirklich eine Reihe von Fragen, eine nach der anderen, die Antworten sind nicht ideal, aber sie sind auch relevant.
Java
的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会比较满。于是有人发明了哈希算法来提高集合中查找元素的效率。这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。
Also hat jemand den Hash-Algorithmus erfunden, um die Effizienz beim Auffinden von Elementen in der Sammlung zu verbessern. Mit dieser Methode kann für jedes Objekt ein Hash-Code berechnet werden. Jede Gruppe entspricht einem bestimmten Speicherbereich. Der Bereich, in dem es gespeichert werden soll. 🎜🎜
hashCode
方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode
hashCode
-Methode kann sofort den physischen Ort lokalisieren, an dem sie platziert werden soll. Wenn sich an dieser Position kein Element befindet, kann es ohne Vergleich direkt an dieser Position gespeichert werden. Wenn an dieser Position bereits ein Element vorhanden ist, rufen Sie die Methode equal auf, um es mit dem neuen Element zu vergleichen nicht gespeichert werden, wenn nicht identisch, andere Adressen hashen. Auf diese Weise wird die Anzahl der tatsächlichen Aufrufe der Methode „equals“ stark reduziert, fast nur ein- oder zweimal. 🎜Lassen Sie uns über das automatische Montageprinzip von Spring Boot sprechen
Diese Frage ist auch deshalb so, weil sie in meinem Lebenslauf steht
Spring Boot
,所以被问到也是正常的,不过我面试前还是看过一些,回答的还行,面试官说差不多是这个意思。在Spring Boot中有个很关键的注解
@SpringBootApplication
,其中这个注解又可以等同于-
@SpringBootConfiguration
-
@EnableAutoConfiguration
-
@ComponentScan
Where
META-INF/spring. factorys
-Dateiinformationen und filtern Sie die Informationen dann mitEnableAutoConfiguration
sind die Schlüsseldaten und werden in den IOC-Container geladen, um die automatische Konfigurationsfunktion zu realisieren!@EnableAutoConfiguration
是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories
文件的信息,然后筛选出以EnableAutoConfiguration
为key的数据,加载到IOC容器中,实现自动配置功能!数据库事务的隔离级别有哪些?
这种问题,背背八股文,网上一堆堆。
数据库事务的隔离级别有4种,由低到高分别为
Read uncommitted
、Read committed
、Repeatable read
、Serializable
Was sind die Isolationsstufen von Datenbanktransaktionen?
🎜Es gibt 4 Isolationsstufen für Datenbanktransaktionen, von niedrig bis hoch:Merken Sie sich für diese Art von Frage die acht- Essay mit Beinen. Es gibt viele davon online.
Uncommitted lesen
、Repeatable read code >, <code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05 ) ;Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: break-all;Farbe: rgb(239, 112, 96);“>Serialisierbar
. 🎜
Uncommitted read( READ UNCOMMITTED
) : Unter dieser Isolationsstufe können andere Transaktionen die nicht festgeschriebenen Änderungen dieser Transaktion sehen, was zu schmutzigen Leseproblemen führt (die nicht festgeschriebenen Teile anderer Transaktionen werden gelesen und dann wird die Transaktion zurückgesetztREAD UNCOMMITTED
):这个隔离级别下,其他事务可以看到本事务没有提交的部分修改,因此会造成脏读的问题(读取到了其他事务未提交的部分,而之后该事务进行了回滚);已提交读( READ COMMITTED
):其他事务只能读取到本事务已经提交的部分,这个隔离级别有不可重复读的问题,在同一个事务内的两次读取,拿到的结果竟然不一样,因为另外一个事务对数据进行了修改;"可重复读( REPEATABLE READ
)。可重复读隔离级别解决了上面不可重复读的问题,但是仍然有一个新问题,就是幻读。当你读取id> 10 的数据行时,对涉及到的所有行加上了读锁,此时例外一个事务新插入了一条id=11的数据,因为是新插入的,所以不会触发上面的锁的排斥,那么进行本事务进行下一次的查询时会发现有一条id=11的数据,而上次的查询操作并没有获取到,再进行插入就会有主键冲突的问题;- Zum Lesen eingereicht);
可串行化( SERIALIZABLE
REPEATABLE READ
). Die Isolationsstufe für wiederholbare Lesevorgänge löst das oben genannte Problem mit nicht wiederholbaren Lesevorgängen, es gibt jedoch noch ein neues Problem, nämlich das Phantomlesen. Wenn Sie die Datenzeile mit der ID> 10 lesen, wird allen beteiligten Zeilen eine Lesesperre hinzugefügt. Zu diesem Zeitpunkt fügt eine Transaktion ein Datenelement mit der ID = 11 neu ein Wenn die Sperre exklusiv ist, finden Sie bei der nächsten Abfrage dieser Transaktion ein Datenelement mit der ID = 11, das beim letzten Abfragevorgang jedoch nicht abgerufen wurde ein Primärschlüsselkonfliktproblem; rgba(27, 31, 35, 0.05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>SERIALIZABLE ). Dies ist die höchste Isolationsstufe, die alle oben genannten Probleme lösen kann, da sie die serielle Ausführung aller Vorgänge erzwingt, was zu einem schnellen Abfall der Parallelitätsleistung führt und daher nicht sehr häufig verwendet wird.Erzählen Sie mir etwas über Ihr Verständnis von Indizes in MySQL.
🎜🎜Diese Frage, okay, sagen Sie mir so viel, wie Sie wissen. Als ich mir die Vorbereitung aller ansah, war ich ziemlich gut vorbereitet. Ich denke, meine Antwort ist ziemlich gut, deshalb habe ich gemeinsam die Vor- und Nachteile des Index beantwortet. 🎜Index ist eine Datenstruktur, die es MySQL ermöglicht, Daten effizient abzurufen. Allgemeiner ausgedrückt ist ein Datenbankindex wie das Inhaltsverzeichnis am Anfang eines Buches, das Datenbankabfragen beschleunigen kann.
Vorteile
Kann die Eindeutigkeit jeder Datenzeile in der Datenbanktabelle sicherstellen Kann die Indizierung von Daten erheblich beschleunigen Beschleunigt die Verbindung zwischen Tabellen, insbesondere bei der Implementierung von Datenreferenzen. Dies ist besonders wichtig sinnvoll im Hinblick auf die Vollständigkeit Bei Verwendung von Gruppierungs- und Sortierklauseln zum Datenabruf kann auch die Zeit für das Gruppieren und Sortieren in Abfragen erheblich verkürzt werden Durch die Verwendung von Indizes werden während des Zeitabfrageprozesses Optimierungs-Hider verwendet Verbessern Sie die Systemleistung Nachteile
Das Erstellen und Verwalten von Indizes nimmt Zeit in Anspruch, die mit der Datenmenge zunimmt Indizes müssen zusätzlich zu den Daten zusätzlich zum belegten Datenraum auch physischen Raum belegen Durch die Tabelle belegt jeder Index auch eine bestimmte Menge an physischem Speicherplatz. Wenn ein Clustered-Index erstellt werden muss, ist der erforderliche Speicherplatz größer Beim Hinzufügen, Löschen oder Ändern von Daten in der Tabelle muss der Index ebenfalls vorhanden sein dynamisch verwaltet werden, was die Wartungsgeschwindigkeit von Ganzzahlen verringert Mit welchen SQL-Optimierungsmethoden sind Sie vertraut?
Diesen Teil habe ich durch die Lektüre von „Grundlegende MySQL-Datenbankkenntnisse für Java-Programmierer“ in Brother Tians Knowledge Planet gelernt. Ich habe nur über einen Teil davon gesprochen, weil Bruder Tian viel zusammengestellt hat. Es tut mir leid, mein Bruder hat ein schlechtes Gedächtnis. Gut.
1. Verwenden Sie nicht select *
2. Versuchen Sie, Unterabfragen zu reduzieren und stattdessen zugehörige Abfragen (Links-Join, Rechts-Join, Inner-Join) zu verwenden.
3. Reduzieren Sie die Verwendung von IN oder NOT IN Oder ersetzen Sie die zugehörige Abfrageanweisung
4 Versuchen Sie, Union oder Union All anstelle von oder Query zu verwenden (Union All ist besser, wenn bestätigt wird, dass keine doppelten Daten vorhanden sind oder keine Notwendigkeit besteht, doppelte Daten zu entfernen)
5 Vermeiden Sie die Verwendung in der where-Klausel. Verwenden Sie den Operator != oder a8093152e673feb7aba1828c43532094, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt.
6. Vermeiden Sie die Beurteilung des Nullwerts von Feldern in der where-Klausel, da die Engine sonst die Verwendung des Index aufgibt und einen vollständigen Tabellenscan durchführt, z. B.: select id from t where num is null Sie können den Standardwert festlegen Geben Sie den Wert 0 für num ein, stellen Sie sicher, dass in der num-Spalte der Tabelle kein Nullwert vorhanden ist, und fragen Sie dann wie folgt ab: select id from t where num=0
Wie wird eine SQL-Abfrage in MySQL ausgeführt?
NND, ich frage so gerne nach MySQL, diese Frage hat mich wirklich verwirrt und der Interviewer wurde etwas ungeduldig, nachdem er Unsinn geredet hatte. Als ich zurückkam, ging ich zu Tian Ge's Knowledge Planet und sah es mir tatsächlich noch einmal an.
Zum Beispiel die folgende SQL-Anweisung (vom Interviewer vor Ort gegeben
SQL
):select 字段1,字段2 from 表 where id=996
Holen Sie sich den Link und verwenden Sie den Connector in MySQL. Abfrage-Cache, der Schlüssel ist die SQL-Anweisung, der Wert ist das Abfrageergebnis, wenn es gefunden wird, wird es direkt zurückgegeben. Es wird nicht empfohlen, den sekundären Cache zu verwenden. Der Abfragecache wurde in der MySQL 8.0-Version gelöscht, was bedeutet, dass diese Funktion nach der MySQL 8.0-Version nicht mehr vorhanden ist. Analyzer, unterteilt in lexikalische Analyse und Syntaxanalyse. In dieser Phase werden lediglich einige SQL-Analysen und Syntaxüberprüfungen durchgeführt. In diesem Stadium liegen also allgemeine Grammatikfehler vor. Der Optimierer bestimmt, welcher Index verwendet werden soll, wenn die Tabelle mehrere Indizes enthält oder wenn in einer Anweisung mehrere Tabellenzuordnungen (Join) vorhanden sind. Er bestimmt die Verbindungsreihenfolge jeder Tabelle. Executor, teilen Sie SQL über den Analysator mit, was Sie tun möchten, wissen Sie über den Optimierer, was zu tun ist, und beginnen Sie mit der Ausführung der Anweisung. Wenn Sie die Anweisung ausführen, müssen Sie auch feststellen, ob Sie über diese Berechtigung verfügen. Wenn Sie keine Berechtigung haben, wird direkt eine Fehlermeldung zurückgegeben, die darauf hinweist, dass Sie keine Berechtigung haben. Öffnen Sie die Tabelle und verwenden Sie die Schnittstelle Wird von der Engine bereitgestellt, um die erste Zeile der Tabelle gemäß der Engine-Definition der Tabelle abzurufen und festzustellen, ob die ID gleich 1 ist. Wenn ja, kehren Sie direkt zurück. Wenn die Engine-Schnittstelle nicht weiterhin aufgerufen wird, um zur nächsten Zeile zu wechseln, wiederholen Sie die gleiche Beurteilung, bis die letzte Zeile der Tabelle abgerufen ist, und kehren Sie schließlich zurück. Ich habe mich gefragt, was 996 bedeutet. Ist Ihr Unternehmen 996? Sag es einfach locker
Was ist der Unterschied zwischen Heap und Stack in JVM?
Das ist nicht schlecht, ich kann es beantworten, wenn ich mit ein wenig JVM-Wissen vertraut bin. Die Erklärung des von Bruder Tian zusammengestellten JVM-Laufzeitdatenbereichs ist sehr schön.
Der wesentliche Unterschied zwischen den beiden: Der Stapel ist für den Thread privat, während der Heap vom Thread gemeinsam genutzt wird.
Stack ist eine Laufzeiteinheit, die Logik darstellt. Ein Stapel entspricht einem Thread, der grundlegende Datentypen und Objektreferenzen im Heap enthält.
Heap ist eine Speichereinheit, die Daten darstellt Kann mehrere Stapel gemeinsam nutzen (einschließlich grundlegender Datentypen, Referenzen und Referenzobjekte in Mitgliedern), der Bereich ist nicht kontinuierlich und es treten Fragmente auf.
1) Verschiedene Funktionen
Stack-Speicher wird zum Speichern lokaler Variablen und Methodenaufrufe verwendet, während Heap-Speicher zum Speichern von Objekten in Java verwendet wird. Unabhängig davon, ob es sich um Mitgliedsvariablen, lokale Variablen oder Klassenvariablen handelt, werden die Objekte, auf die sie verweisen, im Heapspeicher gespeichert.
2), unterschiedliche Freigabe
Stapelspeicher ist privat für Threads. Der Heapspeicher ist allen Threads gemeinsam.
3) Ausnahmefehler sind unterschiedlich
Wenn nicht genügend Stapelspeicher oder Heapspeicher vorhanden ist, wird eine Ausnahme ausgelöst.
Unzureichender Stapelspeicher: java.lang.StackOverFlowError.
Unzureichender Heap-Speicherplatz: java.lang.OutOfMemoryError.
4), Speicherplatzgröße
Die Speicherplatzgröße des Stapels ist viel kleiner als die des Heaps.
Kennen Sie den Klassenlademechanismus?
Dies sind nur die aufeinanderfolgenden Interviewfragen
Das Laden der JVM-Klasse ist in 5 Prozesse unterteilt: Laden, Überprüfung, Vorbereitung, Analyse, Initialisierung, Verwendung, Deinstallation, wie in der folgenden Abbildung dargestellt:
Werfen wir einen Blick auf die spezifischen Aktionen der fünf Prozesse Laden, Verifizieren, Vorbereiten, Parsen und Initialisieren.
Laden
Laden besteht hauptsächlich darin, den binären Bytestrom in der .class-Datei (nicht unbedingt .class. Es kann sich um ein aus dem Netzwerk bezogenes ZIP-Paket handeln) in die JVM zu lesen. Während der Ladephase muss die JVM drei Dinge erledigen: 1) Erhalten Sie den binären Bytestrom der Klasse über den vollständig qualifizierten Namen der Klasse. 2) Konvertieren Sie die durch den Bytestrom dargestellte statische Speicherstruktur in die Laufzeitdatenstruktur von der Methodenbereich; 3) Generieren Sie ein java.lang.Class-Objekt dieser Klasse im Speicher als Zugriffseintrag für verschiedene Daten dieser Klasse im Methodenbereich.
Verbindung
Verifizierung
Die Verifizierung ist der erste Schritt in der Verbindungsphase und stellt hauptsächlich sicher, dass der geladene Bytestrom den JVM-Spezifikationen entspricht. In der Verifizierungsphase werden die folgenden vier Phasen der Verifizierungsaktionen abgeschlossen: 1) Überprüfung des Dateiformats 2) Überprüfung der Metadaten (ob sie der Java-Sprachspezifikation entsprechen) 3) Bytecode-Überprüfung (zur Bestätigung, dass die Programmsemantik legal und logisch ist) 4) Überprüfung der Symbolreferenz (Stellen Sie sicher, dass der nächste Analyseschritt normal ausgeführt werden kann)
Vorbereitung
Weisen Sie im Methodenbereich hauptsächlich Speicher für statische Variablen zu und legen Sie den Standardanfangswert fest.
Auflösung
ist der Prozess, durch den die virtuelle Maschine Symbolreferenzen im Konstantenpool durch direkte Referenzen ersetzt.
Initialisierung
Die Initialisierungsphase ist der letzte Schritt im Klassenladeprozess. Sie weist Klassenvariablen hauptsächlich aktiv Werte gemäß den Zuweisungsanweisungen im Programm zu. Hinweis: 1) Wenn eine übergeordnete Klasse vorhanden ist und die übergeordnete Klasse initialisiert wird, initialisieren Sie zuerst die übergeordnete Klasse. 2) Führen Sie dann die Initialisierungsanweisung für die Unterklasse aus.
Welche Bedingungen können eine vollständige GC auslösen?
Es ist ein bisschen nervös, ich dachte, ich würde nach Garbage-Collection-Algorithmen usw. fragen, aber am Ende habe ich hier gefragt. Ich war nicht bereit dafür, also habe ich nur beiläufig zwei Dinge gesagt, und ich hatte offensichtlich das Gefühl, dass der Interviewer sehr unzufrieden war. Hey, das war's, gehen Sie zurück und bereiten Sie sich gut vor.
Normalerweise gibt es 5 Szenarien, die eine vollständige GC auslösen:
(1) Aufruf
System.gc
时,系统建议执行Full GC
, der jedoch nicht unbedingt ausgeführt wird(2) Unzureichender Speicherplatz in der alten Generation
(3) Methode zum Entfernen von unzureichendem Speicherplatz
(4) Durchschnittliche Größe der alten Generation nach dem Bestehen des Minor GC > Verfügbarer Speicher der alten Generation
(5) Beim Kopieren aus dem Eden-Bereich, vom Space-Bereich in den To-Space-Bereich ist die Objektgröße größer als der verfügbare Speicher von To Space, dann wird das Objekt auf die alte Generation übertragen, und der verfügbare Speicher der alten Generation ist größer kleiner als die Objektgröße. Das heißt, wenn die alte Generation keine Objekte der neuen Generation in der alten Generation speichern kann, wird die vollständige GC ausgelöst.
Die CPU des Online-Systems ist so hoch, was soll ich tun?
Die Antwort auf diese Frage ist nicht sehr zufriedenstellend. Ich weiß, dass Bruder Tian ein Dokument zusammengestellt hat, aber nachdem ich es auf dem Heimweg noch nicht gesehen habe, stellte ich fest, dass dies auch der Fall sein kann Frage, ich habe sie nicht beantwortet. Der Interviewer kam und sagte: OK, unser Interview endet hier. Ich werde hier der Personalabteilung Bericht erstatten.
Nach einer Weile kam die schöne Personalabteilung mit einem Lächeln zu mir (ich dachte, das Problem sei nicht ernst), aber es stellte sich heraus...
Sie sind „YY, der Interviewer hat Feedback zur Interviewsituation gegeben. Wir werden uns das umfassend ansehen. Sie gehen zuerst zurück. Wir rufen Sie an, um Sie später über die Ergebnisse zu informieren.“
(⊙o⊙)..., es vergingen mehr als n Tage und es gab keine Neuigkeiten. Es war wirklich cool.
Der normale Vorgang ist:
1. top oder by mit P: 1040 // Sortieren Sie zuerst nach Prozesslast, um axLoad(pid) zu finden
2. top -Hp Prozess-PID: 1073 // Finden Sie die relevante Last Thread-PID
3. printf „0x%xn“ Thread-PID: 0x431 // Konvertieren Sie die Thread-PID in Hexadezimalzahl, um sie auf die spätere Suche im Jstack-Protokoll vorzubereiten
4. jstack-Prozess-PID |. vim +/hex thread PID - // Zum Beispiel: jstack 1040|vim +/0x431 -
Zusammenfassung
Der gesamte Interviewprozess war relativ einfach und der Interviewer war auch freundlich Es ist ziemlich gut. Da ich seit zwei Jahren arbeite, habe ich einige der Fragen noch nie gesehen. Die Fragen des Interviewers scheinen jedoch vorbereitet zu sein. , und es muss nicht unbedingt persönlich durchgeführt werden.
Das obige ist der detaillierte Inhalt vonLetzte Woche hatte ich ein Vorstellungsgespräch bei XX Insurance und es war cool! ! !. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!