Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Coudy Hou
JavaGuide
提交
33f2830a
J
JavaGuide
项目概览
Coudy Hou
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
33f2830a
编写于
11月 05, 2018
作者:
靳
靳阳
提交者:
GitHub
11月 05, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改几个错别字
修改几个错别字
上级
0061f4ee
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
7 addition
and
7 deletion
+7
-7
Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md
Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md
+7
-7
未找到文件。
Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md
浏览文件 @
33f2830a
...
...
@@ -22,7 +22,7 @@
## 2 运行时数据区域
Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。
![
运行时数据区域
](
https://user-gold-cdn.xitu.io/2018/4/27/16306a34cd8a4354?w=513&h=404&f=png&s=132068
)
这些组成部分一些
事
线程私有的,其他的则是线程共享的。
这些组成部分一些
是
线程私有的,其他的则是线程共享的。
**线程私有的:**
...
...
@@ -75,7 +75,7 @@ Java 虚拟机栈也是线程私有的,每个线程都有各自的Java虚拟
### 2.4 堆
Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。
**此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。**
Java 堆是垃圾收集器管理的主要区域,因此也被称作
**GC堆(Garbage Collected Heap)**
.从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代:
在
细致一点有:Eden空间、From Survivor、To Survivor空间等。
**进一步划分的目的是更好地回收内存,或者更快地分配内存。**
Java 堆是垃圾收集器管理的主要区域,因此也被称作
**GC堆(Garbage Collected Heap)**
.从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以Java堆还可以细分为:新生代和老年代:
再
细致一点有:Eden空间、From Survivor、To Survivor空间等。
**进一步划分的目的是更好地回收内存,或者更快地分配内存。**
![](
https://user-gold-cdn.xitu.io/2018/8/25/16570344a29c3433?w=599&h=250&f=png&s=8946
)
...
...
@@ -159,9 +159,9 @@ JDK1.4中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通
### 3.2 对象的内存布局
在 Hotspot 虚拟机中,对象在内存中的布局可以分为3
快
区域:
**对象头**
、
**实例数据**
和
**对齐填充**
。
在 Hotspot 虚拟机中,对象在内存中的布局可以分为3
块
区域:
**对象头**
、
**实例数据**
和
**对齐填充**
。
**Hotspot虚拟机的对象头包括两部分信息**
,
**第一部分用于存储对象自身的自身运行时数据**
(哈希
吗
、GC分代年龄、锁状态标志等等),
**另一部分是类型指针**
,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
**Hotspot虚拟机的对象头包括两部分信息**
,
**第一部分用于存储对象自身的自身运行时数据**
(哈希
码
、GC分代年龄、锁状态标志等等),
**另一部分是类型指针**
,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
**实例数据部分是对象真正存储的有效信息**
,也是在程序中所定义的各种类型的字段内容。
...
...
@@ -173,7 +173,7 @@ JDK1.4中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通
1.
**句柄:**
如果使用句柄的话,那么Java堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息;
![
使用句柄
](
https://user-gold-cdn.xitu.io/2018/4/27/16306b9573968946?w=786&h=362&f=png&s=109201
)
2.
**直接指针:**
如果使用直接指针访问,那么 Java 堆对
像
的布局中就必须考虑如何放置访问类型数据的相关信息,而reference 中存储的直接就是对象的地址。
2.
**直接指针:**
如果使用直接指针访问,那么 Java 堆对
象
的布局中就必须考虑如何放置访问类型数据的相关信息,而reference 中存储的直接就是对象的地址。
![
使用直接指针
](
https://user-gold-cdn.xitu.io/2018/4/27/16306ba3a41b6b65?w=766&h=353&f=png&s=99172
)
...
...
@@ -203,7 +203,7 @@ JDK1.4中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通
**2 String 类型的常量池比较特殊。它的主要使用方法有两种:**
-
直接使用双引号声明出来的 String 对象会直接存储在常量池中。
-
如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。
-
如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方
法。
String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。
```
java
String
s1
=
new
String
(
"计算机"
);
...
...
@@ -211,7 +211,7 @@ JDK1.4中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通
String
s3
=
"计算机"
;
System
.
out
.
println
(
s2
);
//计算机
System
.
out
.
println
(
s1
==
s2
);
//false,因为一个是堆内存中的String对象一个是常量池中的String对象,
System
.
out
.
println
(
s3
==
s2
);
//true,因为两个都是常量池中的String对
System
.
out
.
println
(
s3
==
s2
);
//true,因为两个都是常量池中的String对
象
```
**3 String 字符串拼接**
```
java
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录