没有合适的资源?快使用搜索试试~ 我知道了~
JVM内存分配与垃圾回收详解
5星 · 超过95%的资源 需积分: 16 13 下载量 155 浏览量
2012-07-06
17:11:01
上传
评论 1
收藏 10.83MB DOCX 举报
温馨提示
试读
29页
个人整理 jvm相关知识 包括内存分配机制 垃圾回收机制 垃圾收集器相关 及 垃圾收集算法
资源推荐
资源详情
资源评论
JVM 相关
1. Jvm
运行时数据区域
2.
3.
4. 程序计数器:它是线程私有的,它是一块较小的内存空间,它的作用可以看做是当前
线程所执行的字节码的行号指示器。如果线程正执行的是一个 java 方法它记录的是正
在执行的虚拟机字节码指令的地址,如果线程正执行的是一个 Nave 方法这个记数器
的 是 则 为空 (Undened) 此内存区 域 也 是 唯 一 一 个 在 java 虚 拟 机 规 范 中 没 有 规 定
OutOfMemoryError 情况的区域.
5. Java 虚拟机栈:它也是线程私有的生命周期与线程生命周期相同。它描述的是 java 方
法执行的内存模型:每个方法被执行的时候 都会创建一个栈桢用来存储 局部变量表
方 法 出 入 口 信 息 每 一 个 方 法 被 调 用 直 至 执 行 完 成 的 过 程 ,
6. 本地方法栈:此区域与虚拟机栈起到的作用类似,只不是过虚拟机栈是针对 java 方法
而 此 区 域 是 针 对 nave 方 法 同 时 此 区 域 也 会 抛 出 StackOver#owError 和
OutOfMemoryError 两种异常.
7. Java 堆:它是 java 虚拟机管理的内存中最大的一块,它是被所有线程共享的一块内存
区域,它在虚拟机启动时创建,它的唯一目的是存储对象实例,几乎所有的对象都在
这里分配内存。Java 堆也是垃圾收集器管理的主要区域,如果从内存回收的角度看 由
于现在收集器采用分代收集算法所以可以分为老年代和新生代 再细致有 Eden 空间
from、to 空间 但是无论怎么划分 它都是只是存储对象实例而已。
8. 方 法 区 :
9. 运 行 时 常 量 池 :
10. 常量池详解:
使用 来实现字符串的存储也就是说 对象创建之后就不能
再修改此对象中存储的字符串内容就是因为如此才说 类型是不 可变的。 类
有一个特殊的创建方法就是使用双引号来创建例如 实际创建了 个
对象一个是通过双引号创建的另一个是通过 创建的只不过他们创建的时期
不同
一个是编译期一个是运行期 对 类型重载了操作符可以直接使用对两个字符串进行
连接。运行期调用 类的 方法可以向 !! 中动态添加对象。
例
"#"""$
%%此语句同上
"#"""$
&"!"##"$%%结果为
例
"#"""$
"#"""$
&"!"##"$%%结果为 "
例 '
"#"""$
"#"$
"#"""$
&"!"##"$%%结果为
例 (
"#$
"#"""$
"'#"""$
"(#""""$
&"!"##"'$%%
&"!"##"($%%"
&"!"##"($%%
结果上面分析,总结如下:
1.单独使用""引号创建的字符串都是常量,编译期就已经确定存储到 String Pool 中;
2,使用 new String("")创建的对象会存储到 heap 中,是运行期新创建的;
3,使用只包含常量的字符串连接符如"aa" + "aa"创建的也是常量,编译期就能确定,已经确定存
储到 String Pool 中;
4,使用包含变量的字符串连接符如"aa" + s1 创建的对象是运行期才创建的,存储在 heap 中;
还有几个经常考的面试题)
"#"$
"#"$
上面创建了几个 对象*
答案)' 个 编译期 +!" !! 中创建 个运行期 中创建 个(用 创建的每 一
次就在堆上创建一个对象,用引号创建的如果在常量池中已有就直接指向,不用创建)
"#"$
"#"$
"#"$
" 指向的对象中的字符串是什么*
答案)"。(永远不要忘了 不可变的,"#"$实际上 " 的指向就变了,因为你不可以
去改变一个 ,)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,
是一个特殊的包装类数据。可以用:
"#$-
"#$-
两种的形式来创建,第一种是用 来新建对象的,它会在存放于堆中。每调用一次就会创建一个
新的对象。
而第二种是先在栈中创建一个对 类的对象引用变量 ",然后通过符号引用去字符串常量池里
找有没有如果没有,则将存放进字符串常量池,并令 " 指向”.,如果已经有”.则
直接令 " 指向“.。
比较类里面的数值是否相等时,用 /"方法;当测试两个包装类的引用是否指向同一个对象时,
用##,下面用例子说明上面的理论。
"#$-
"#$-
&"!"##"$%%-
可以看出 " 和 " 是指向同一个对象的。
"#$-
"#$-
&"!"##"$%%"-
用 的方式是生成不同的对象。每一次生成一个。
因 此用第二种方式创建多个”.字符串在内存中其实只存在一个对象而已这种写法有利与节省内
存空间同时它可以在一定程度上提高程序的运行速度,因为 012 会自动根据栈中数据的实际情况来
决定是否有必要创建新对象。而对于 "#;的代码,则一概在堆中创建新对
象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另 一方面要注意)我们在使用诸如 "#;的格式定义类时,总是想当然地认为,创建了
类的对象 "。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。
只有通过 方法才能保证每次都创建一个新的对象。
由于 String 类的 immutable 性质,当 String 变量需要经常变换其值时,应该考虑使用 StringBuffer
类,以提高程序效率。
首先 不属于 3 种基本数据类型, 是一个对象。
因为对象的默认值是 ,所以 的默认值也是 ;但它又是一种特殊的对象,有其它对象没
有的一些特性。
和 .都是申明一个新的空字符串,是空串不是 ;
'"#.4.;"#.4.的区别
看例 :
"5#4$-
"#4$-
"#4$-
&"!"5##"$-
&"!"5##"$-
结果为:
-
-
首先,我们要知结果为道 0 会确保一个字符串常量只有一个拷贝。
因 为例子中的 "5 和 " 中的”4.都是字符串常量,它们在编译期就被确定了,所以 "5##" 为
;而”4.和”.也都是字符串常 量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是
字符串常量,所以 " 也同样在编译期就被解析为一个字符串常量,所以 " 也是常量池中” 4.的一
个引用。所以我们得出 "5##"##";用 创建的字符串不是常量,不能在编译期就确定 ,
所以 创建的字符串不放入常量池中,它们有自己的地址空间。
看例 :
"5#4$-
"#4$-
"#4$-
&"!"5##"$-
&"!"5##"$-
&"!"##"$-
结果为:
"-
"-
"-
剩余28页未读,继续阅读
资源评论
- freebird2012-12-01还不错,比较详细
- d643515692012-07-10还是有点稀里糊涂··
liuxing13521773215
- 粉丝: 3
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功