---
category: Java
tag:
- JVM
---
# Java
HotSpot
## ()
###
- ** Java **
- **Java **
- ****
###
- **String **
- **8 **
##
Java C/C++ new delete/free Java Java
##
Java Java JDK 1.8
**JDK 1.8 **

**JDK 1.8 **

****
-
-
-
****
-
-
- ()
### 2.1
****
****
****
1.
2.
** `OutOfMemoryError` **
### 2.2 Java
**Java Java **
**Java Heap (Stack)** Java
****booleanbytecharshortintfloatlongdouble****reference
**Java `StackOverFlowError` `OutOfMemoryError`**
- **`StackOverFlowError`** Java Java StackOverFlowError
- **`OutOfMemoryError`** Java `OutOfMemoryError`

Java Java
**/**
Java Java Java
Java
1. return
2.
### 2.3
** Java Native ** HotSpot Java
`StackOverFlowError` `OutOfMemoryError`
### 2.4
Java Java ****
Java JIT JDK 1.7
Java **GC Garbage Collected Heap** Java Eden From SurvivorTo Survivor ****
JDK 7 JDK 7
1. (Young Generation)
2. (Old Generation)
3. (Permanent Generation)

JDK 8 HotSpot JDK1.7

** Eden Survivor Survivor from to**
Eden s0 s1 1(Eden ->Survivor 1) 15 `-XX:MaxTenuringThreshold`
> ** [issue552](https://github.com/Snailclimb/JavaGuide/issues/552)** Hotspot survivor MaxTenuringThreshold
>
> ****
>
> ```c++
> uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
> //survivor_capacitysurvivor
> size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
> size_t total = 0;
> uint age = 1;
> while (age < table_size) {
> total += sizes[age];//sizes
> if (total > desired_survivor_size) break;
> age++;
> }
> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
> ...
> }
> ```
OutOfMemoryError
1. **`java.lang.OutOfMemoryError: GC Overhead Limit Exceeded`** JVM
2. **`java.lang.OutOfMemoryError: Java heap space`** :, , (`-Xmx`[Default Java 8 max heap size](https://stackoverflow.com/questions/28272923/default-xmxsize-in-java-8-max-heap-size))
3. ......
### 2.5
Java **Java ** **Non-Heap** Java
#### 2.5.1
> Java JVM ** Java HotSpot ** HotSpot Java
#### 2.5.2
JDK 1.8
```java
-XX:PermSize=N // ()
-XX:MaxPermSize=N // () , OutOfMemoryError :java.lang.OutOfMemoryError: PermGen
```
JDK 1.8 HotSpot JDK1.7
```java
-XX:MetaspaceSize=N // Metaspace
-XX:MaxMetaspaceSize=N // Metaspace
```
#### 2.5.3 (PermGen) (MetaSpace) ?
Java 3 2.2.5

1. JVM
> `java.lang.OutOfMemoryError: MetaSpace`
`-XXMaxMetaspaceSize` unlimited`-XXMetaspaceSize` Metaspace
2. `MaxPermSize` ,
3. JDK8 HotSpot JRockit , JRockit ,
### 2.6
Class
OutOfMemoryError
~~**JDK1.7 JVM Java Heap**~~
> ** [issue747](https://github.com/Snailclimb/JavaGuide/issues/747)[reference](https://blog.csdn.net/q5706503/article/details/84640762)**
>
> 1. **JDK1.7 , hotspot **
> 2. **JDK1.7 , ,,, hotspot **
> 3. **JDK1.8 hotspot (Metaspace), , , (Metaspace)**
JVM https://www.zhihu.com/question/57109429/answer/151717241 by RednaxelaFX
### 2.7
** OutOfMemoryError **
JDK1.4 **NIO(New Input/Output) ****Channel****Buffer** I/O Native Java DirectByteBuffer ** Java Native **
Java
## HotSpot
HotSpot Java
### 3.1
Java

#### Step1:
new
#### Step2:
******** Java **** **** **** ** Java Java **
****
Java Java GC "-""-""-"

****
- **CAS+** CAS ** CAS **
- **TLAB** Eden JVM TLAB TLAB TLAB CAS
#### Step3:
Java
#### Step4:
**** GC ****
#### Step5: init
Java `` new ``
### 3.2
Hotspot 3 ************
**Hotspot ******GC ****
****
**** Hotspot 8 8 8 1 2
### 3.3
Java reference ** **** **
1. **** Java reference

2. **** Java reference

** reference reference **
##
### 4.1
**String +**
`final` JDK1.8
```java
String str1 = "str";
String str2 = "ing";
String str3 = "str" + "ing";//
String str4 = str1 + str2; //
String str5 = "string";//
System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false
```
> **** String `equals()` `String` `equals` `Object` `equals` `String` `equals` `==` IDEA `equals()`

> == ==
jvm
> **** JVM String
>
> ```java
> String aa = "ab"; //
> String bb = "ab"; //
> System.out.println("aa==bb");// true
> ```
>
> JDK1.7 JDK1.7
> Javac **(Constant Folding)** Java
>
> 
>
> Javac ()
>
> `String str3 = "str" + "ing";` `String str3 = "string";`
>
>
>
> 1. (bytebooleanshortcharintfloatlongdouble)
> 2. `final`
> 3. +\>>>
`str1` `str2` `str3`
+ `StringBuilder` `append()` `toString()` `String`
```java
String str4 = new StringBuilder().append(str1).append(str2).toString();
```
`str4`

`StringBuilder` `StringBuffer`
`final`
```java
final String str1 = "str";
final String str2 = "ing";
//
String c = "str" + "str2";//
String d = str1 + str2; //
System.out.println(c == d);// true
```
`final` `String`
`str2`
```java
final String str1 = "str";
final String str2 = getStr();
String c = "str" + "str2";//
String d = str1 + str2; //
System.out.println(c == d);// false
public static String getStr() {
return "ing";
}
```
****
```java
String str1 = "abcd";
String str2 = new String("abcd");
String str3 = new String("abcd");
System.out.println(str1==str2);
System.out.println(str2==str3);
```
```
false
false
```
****
```java
//
String str1 = "abcd";
```
jvm "abcd" str1 str1 "abcd""
`str1`
```java
//
String str2 = new String("abcd");
String str3 = new String("abcd");
```
** new **
new 3
1.
2. new
3.
`str2` `str3`
****
1. `String`
2. `String` `String` `intern()` `String.intern()` Native String JDK1.7 1.7 `String` JDK1.7 jvm
JDK 1.8 :
```java
String s1 = "Javatpoint";
String s2 = s1.intern();
String s3 = new String("Javatpoint");
String s4 = s3.intern();
System.out.println(s1==s2); // True
System.out.println(s1==s3); // False
System.out.println(s1==s4); // True
System.out.println(s2==s3); // False
System.out.println(s2==s4); // True
System.out.println(s3==s4); // False
```
****
1. ====
2. Javac **(Constant Folding)** Javac ()
3. new `String` `String s1 = "java"`
4. `final` `String`
### 4.2 String s1 = new String("abc");
1 2
- abcabc
- abc 2
****
```java
String s1 = new String("abc");//
String s2 = "abc";
System.out.println(s1 == s2);// false,
System.out.println(s1.equals(s2));// true
```
****
```
false
true
```
### 4.3 8
Java
`Byte`,`Short`,`Integer`,`Long` 4 **[-128127]** `Character` **[0,127]** `Boolean` `True` Or `False`
`Float`,`Double`
```java
Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// true
Integer i11 = 333;
Integer i22 = 333;
System.out.println(i11 == i22);// false
Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// false
```
**Integer **
```java
/**
*-128 127
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i