Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
清新范er
JavaGuide
提交
51e082a8
J
JavaGuide
项目概览
清新范er
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
4
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 搜索 >>
提交
51e082a8
编写于
8月 09, 2019
作者:
Y
yidasanqian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
书写更正
上级
eef847ea
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
3 addition
and
3 deletion
+3
-3
docs/java/jvm/Java内存区域.md
docs/java/jvm/Java内存区域.md
+3
-3
未找到文件。
docs/java/jvm/Java内存区域.md
浏览文件 @
51e082a8
...
@@ -197,7 +197,7 @@ JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1
...
@@ -197,7 +197,7 @@ JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1
JDK1.4 中新加入的
**NIO(New Input/Output) 类**
,引入了一种基于
**通道(Channel)**
与
**缓存区(Buffer)**
的 I/O 方式,它可以直接使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为
**避免了在 Java 堆和 Native 堆之间来回复制数据**
。
JDK1.4 中新加入的
**NIO(New Input/Output) 类**
,引入了一种基于
**通道(Channel)**
与
**缓存区(Buffer)**
的 I/O 方式,它可以直接使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为
**避免了在 Java 堆和 Native 堆之间来回复制数据**
。
本机直接内存的分配不会
收
到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。
本机直接内存的分配不会
受
到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。
## 三 HotSpot 虚拟机对象探秘
## 三 HotSpot 虚拟机对象探秘
...
@@ -253,7 +253,7 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
...
@@ -253,7 +253,7 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
**对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起占位作用。**
因为 Hotspot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,换句话说就是对象的大小必须是 8 字节的整数倍。而对象头部分正好是 8 字节的倍数(1 倍或 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
**对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起占位作用。**
因为 Hotspot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,换句话说就是对象的大小必须是 8 字节的整数倍。而对象头部分正好是 8 字节的倍数(1 倍或 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。
### 3.3 对象的访问定位
### 3.3 对象的访问定位
建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式
有
虚拟机实现而定,目前主流的访问方式有
**①使用句柄**
和
**②直接指针**
两种:
建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式
由
虚拟机实现而定,目前主流的访问方式有
**①使用句柄**
和
**②直接指针**
两种:
1.
**句柄:**
如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息;
1.
**句柄:**
如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息;
...
@@ -322,7 +322,7 @@ System.out.println(str2==str3);//false
...
@@ -322,7 +322,7 @@ System.out.println(str2==str3);//false
尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。
尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。
### 4.2 String s1 = new String("abc");这句话创建了几个字符串对象?
### 4.2 String s1 = new String("abc");这句话创建了几个字符串对象?
**将创建 1 或 2 个字符串。如果池中已存在字符串
文字“abc”,则池中只会创建一个字符串“s1”。如果池中没有字符串文字
“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共 2 个字符串对象。**
**将创建 1 或 2 个字符串。如果池中已存在字符串
常量“abc”,则只会在堆空间创建一个字符串常量“abc”。如果池中没有字符串常量
“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共 2 个字符串对象。**
**验证:**
**验证:**
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录