();
- //用于标识弹出序列的位置
- int popIndex = 0;
- for(int i = 0; i< pushA.length;i++){
- s.push(pushA[i]);
- //如果栈不为空,且栈顶元素等于弹出序列
- while(!s.empty() &&s.peek() == popA[popIndex]){
- //出栈
- s.pop();
- //弹出序列向后一位
- popIndex++;
- }
- }
- return s.empty();
- }
-}
-```
\ No newline at end of file
diff --git a/docs/java/Basis/Arrays,CollectionsCommonMethods.md b/docs/java/Basis/Arrays,CollectionsCommonMethods.md
index 5c7e705b..ec083552 100644
--- a/docs/java/Basis/Arrays,CollectionsCommonMethods.md
+++ b/docs/java/Basis/Arrays,CollectionsCommonMethods.md
@@ -90,7 +90,7 @@ int max(Collection coll)//根据元素的自然顺序,返回最大的元素。
int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素。
int frequency(Collection c, Object o)//统计元素出现次数
-int indexOfSubList(List list, List target)//统计targe在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
+int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素
```
diff --git a/docs/java/Java基础知识.md b/docs/java/Java基础知识.md
index cf6255b0..d45865aa 100644
--- a/docs/java/Java基础知识.md
+++ b/docs/java/Java基础知识.md
@@ -110,7 +110,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
## 4. Oracle JDK 和 OpenJDK 的对比
-可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么Oracle和OpenJDK之间是否存在重大差异?下面通过我通过我收集到一些资料对你解答这个被很多人忽视的问题。
+可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么Oracle和OpenJDK之间是否存在重大差异?下面我通过收集到的一些资料,为你解答这个被很多人忽视的问题。
对于Java 7,没什么关键的地方。OpenJDK项目主要基于Sun捐赠的HotSpot源代码。此外,OpenJDK被选为Java 7的参考实现,由Oracle工程师维护。关于JVM,JDK,JRE和OpenJDK之间的区别,Oracle博客帖子在2012年有一个更详细的答案:
@@ -356,7 +356,7 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返
## 28. 为什么Java中只有值传递
- [为什么Java中只有值传递?](https://github.com/Snailclimb/JavaGuide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/%E7%AC%AC%E4%B8%80%E5%91%A8%EF%BC%882018-8-7%EF%BC%89.md)
+ [为什么Java中只有值传递?](https://github.com/Snailclimb/JavaGuide/blob/master/docs/essential-content-for-interview/MostCommonJavaInterviewQuestions/%E7%AC%AC%E4%B8%80%E5%91%A8%EF%BC%882018-8-7%EF%BC%89.md)
## 29. 简述线程,程序,进程的基本概念.以及他们之间关系是什么?
diff --git a/docs/java/可能是把Java内存区域讲的最清楚的一篇文章.md b/docs/java/可能是把Java内存区域讲的最清楚的一篇文章.md
index 66a15333..8648c63d 100644
--- a/docs/java/可能是把Java内存区域讲的最清楚的一篇文章.md
+++ b/docs/java/可能是把Java内存区域讲的最清楚的一篇文章.md
@@ -1,4 +1,29 @@
+
+
+- [写在前面(常见面试题)](#写在前面常见面试题)
+ - [基本问题](#基本问题)
+ - [拓展问题](#拓展问题)
+- [一 概述](#一-概述)
+- [二 运行时数据区域](#二-运行时数据区域)
+ - [2.1 程序计数器](#21-程序计数器)
+ - [2.2 Java 虚拟机栈](#22-java-虚拟机栈)
+ - [2.3 本地方法栈](#23-本地方法栈)
+ - [2.4 堆](#24-堆)
+ - [2.5 方法区](#25-方法区)
+ - [2.6 运行时常量池](#26-运行时常量池)
+ - [2.7 直接内存](#27-直接内存)
+- [三 HotSpot 虚拟机对象探秘](#三-hotspot-虚拟机对象探秘)
+ - [3.1 对象的创建](#31-对象的创建)
+ - [3.2 对象的内存布局](#32-对象的内存布局)
+ - [3.3 对象的访问定位](#33-对象的访问定位)
+- [四 重点补充内容](#四--重点补充内容)
+ - [String 类和常量池](#string-类和常量池)
+ - [String s1 = new String("abc");这句话创建了几个对象?](#string-s1--new-stringabc这句话创建了几个对象)
+ - [8种基本类型的包装类和常量池](#8种基本类型的包装类和常量池)
+- [参考](#参考)
+
+
## 写在前面(常见面试题)
### 基本问题
@@ -26,7 +51,6 @@ Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成
-
**JDK 1.8 :**
@@ -105,15 +129,41 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作**GC堆(Ga
### 2.5 方法区
-**方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。**
+方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 **Non-Heap(非堆)**,目的应该是与 Java 堆区分开来。
-HotSpot 虚拟机中方法区也常被称为 **“永久代”**,本质上两者并不等价。仅仅是因为 HotSpot 虚拟机设计团队用永久代来实现方法区而已,这样 HotSpot 虚拟机的垃圾收集器就可以像管理 Java 堆一样管理这部分内存了。但是这并不是一个好主意,因为这样更容易遇到内存溢出问题。
+方法区也被称为永久代。很多人都会分不清方法区和永久代的关系,为此我也查阅了文献。
-**相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。**
+#### 方法区和永久代的关系
-JDK 1.8 的时候,方法区被彻底移除了(JDK1.7就已经开始了),取而代之是元空间,元空间使用的是直接内存。
+> 《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 **方法区和永久代的关系很像Java中接口和类的关系,类实现了接口,而永久代就是HotSpot虚拟机对虚拟机规范中方法区的一种实现方式。** 也就是说,永久代是HotSpot的概念,方法区是Java虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现,其他的虚拟机实现并没有永久带这一说法。
-我们可以使用参数: `-XX:MetaspaceSize ` 来指定元数据区的大小。与永久区很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。
+#### 常用参数
+
+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的最大大小
+```
+
+与永久代很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。
+
+#### 为什么要将永久代(PermGen)替换为元空间(MetaSpace)呢?
+
+整个永久代有一个 JVM 本身设置固定大小上线,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,并且永远不会得到java.lang.OutOfMemoryError。你可以使用 `-XX:MaxMetaspaceSize` 标志设置最大元空间大小,默认值为 unlimited,这意味着它只受系统内存的限制。`-XX:MetaspaceSize` 调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。
+
+当然这只是其中一个原因,还有很多底层的原因,这里就不提了。
### 2.6 运行时常量池
@@ -343,10 +393,10 @@ i4=i5+i6 true
- 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》
- 《实战java虚拟机》
-- https://www.cnblogs.com/CZDblog/p/5589379.html
-- https://www.cnblogs.com/java-zhao/p/5180492.html
-- https://blog.csdn.net/qq_26222859/article/details/73135660
-- https://blog.csdn.net/cugwuhan2014/article/details/78038254
+-
+-
+-
+-