`
ztianlong
  • 浏览: 65280 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java内存

 
阅读更多
java内存分配:
根据是否是线程来占有的:
线程独享的:
程序计数器 :记录当前线程执行到的行数(如果当前执行的是native方法的话,则计数器的值为undefined)
虚拟机栈:   每个方法被执行的时候,都被会创建一个帧栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
本地方法栈    为本地(native)方法提供的内存区域

虚拟机相关的(线程共享的):
堆          存放对象实例的 
方法区 存储已被java虚拟机加载的类信息,常量,静态变量,即时编译器 编译后的代码等数据 
运行时常量池:(方法区的一部分)存放了编译期生成的各种字面量和符号引用,和运行期间产生的新的常量

直接内存(非虚拟机运行时数据区的一部分)


垃圾回收的区域:
    和线程相关的 虚拟机栈,本地方法栈,pc计数器所占用的空间是确定的,分配和回收随着线程的开始和结束而进行的。

虚拟机相关的内存区域是回收的重点,即堆和方法区。


内存分配:
   对象优先在eden区分配
大对象直接进入老年代
    长期存活的对象会晋升到老年代

判断对象是否已死的算法:
   1.引用计数法
   2.根搜索算法  java 虚拟机采用的方式 (可以防止循环引用) 如果某个对象到GC Roots没有任何引用链,那么这个对象就是不可达的,会被垃圾回收器回收掉。
     可以作为GC Roots的对象:
    虚拟机栈中引用的对象
本地方法栈中引用的对象
方法区中的类静态变量引用的对象
方法区中的常量引用的对象

引用的类型
1.强引用 不会被垃圾回收掉的引用
2.软引用 在将要发生内存溢出的时候,GC进行垃圾回收之后发现还是不能避免溢出的时候,会回收这类引用的对象
3.弱引用 在下一次GC时会被回收的对象
4.虚引用

方法区的回收:

    1.废弃的常量
2.无用的类




名称 作用区域 特点 优点
Serial 新生代 单线程收集器,在回收的时候会暂停其他线程的工作(stop the world) 在单个CPU的环境下,可以获得最高的单线程收集效率,适用于运行在client模式下的虚拟机的新生代gc首选

ParNew 新生代 Serial的多线程版本 是运行在server模式下的虚拟机首选的新生代收集器

Parallel scavenge 新生代 主要用于控制吞吐量。复制算法,并行的多线程收集器,提供了自适应策略 适合在后台运算,而不需要太多交互的场合
Serial old 老年代 Serial的老年代版本 1.在1.5之前与 parallel scavenge搭配
2.作为CMS收集器的后背预案

Parallel old 老年代 Parallel scavenge的老年代版本 标记-整理算法 在注重吞吐量及cpu资源敏感的场合优先考虑
Concurrent mark sweep  CMS 老年代 标记-清除算法
四步:
初始标记(stop the world)
并发标记
重新标记(stop the world)
并发清除

以获取最短回收停顿为目标


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics