[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/Coder994/JavaGuide/master/docs/java/jvm/memory-area.md [Back]  [Original]

---
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 **

![](./pictures/java/JVM.png)

**JDK 1.8 **

![](./pictures/java/JavaJDK1.8.png)

****

- 
- 
- 

****

- 
- 
-  ()

### 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`

![](./pictures/java/2-.png)

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)

![JVM-JDK7](./pictures/java/JVM-JDK7.png)

JDK 8 HotSpot JDK1.7 

![JVM-JDK8](./pictures/java/JVM-jdk8.png)

** 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

![](https://img-blog.csdnimg.cn/20210425134508117.png)

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 
![Java](./pictures/java/Java.png)

#### Step1:

 new 

#### Step2:

******** Java **** ****  **** ** Java  Java **

****

 Java  Java  GC "-""-""-"

![](./pictures/java/.png)

****



- **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 

   ![-](./pictures/java/-.png)

2. ****  Java  reference 

![-](./pictures/java/-.png)

** 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()` 

![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/java-guide-blog/image-20210817123252441.png)

> == ==

 jvm 

> ****  JVM String 
>
> ```java
> String aa = "ab"; // 
> String bb = "ab"; // 
> System.out.println("aa==bb");// true
> ```
>
> JDK1.7 JDK1.7 



> Javac  **(Constant Folding)**  Java 
>
> ![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/image-20210817142715396.png)
>
>  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` 



![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/java-guide-blog/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8B%BC%E6%8E%A5-%E5%B8%B8%E9%87%8F%E6%B1%A0.png)

 `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 

Web Proxy Viewer  |  New URL  |  Original Page