jvm内存包括:html
- 程序计数器:
- 是jvm 中较小的一块内存,每个线程一个计数器。主要保存当前线程执行的虚拟字节码指令的内存地址,java 多线程,是多个线程之间的轮流切换并分配处理器时间的方式实现的。在任什么时候刻,处理器只会执行一个线程中的指令。
- 虚拟机栈(java栈):虚拟机栈是和线程紧密相关的,(每建立一个线程就建立一个Java栈, 因此Java栈也是线程私有的内存区域)一个线程就是一个Java栈,一个java栈中有多个栈帧,每调用一个方法的时候就会在Java栈中建立并压入一个栈帧,栈帧就是用来存储方法数据和部分过程结果的数据结构, 每个方法从开始调用到最终返回结果的过程,都对应这个栈帧的入栈和出栈的过程。
- 本地方法栈
- 本地方法栈是为native方法服务的,虚拟机栈是为java方法服务的。做用和虚拟机栈的做用类似。
- 方法区
- 方法区是用来存储类结构信息的地方,包含常量池,静态变量,构造函数等类信息,类信息是由类加载器在加载类的时候会在类文件中提取出来的
- 也有垃圾回收机制,由于用户经过自定义加载器加载一些类一样会成为垃圾,jvm 会回收未被引用的对象,以便方法区的内存最小。
- 还存着常量池,包含一些常量和符号引用(加载类的连接阶段中符号引用会被转换为直接引用),
- 方法区是线程共享的
- 堆:用来存放对象实例,垃圾回收的主要区域
- java 堆划分为两个不一样的区域:新生代()young和老年代(old)。

- 新生代又被划分为3个区域:Eden, from Survivor,to Survivor,默认的 Eden:from:to = 8:1:1 (能够经过 -XX SurvivorRatio 参数调节);即Eden=8/10 的新生代的空间大小, from = to = 1/10 的新生代的空间大小。JVM 每次只会使用Eden 和其中一个Survivor 区域为对象服务,不管什么时候总有一块Servivor 是空闲的。因此新生代实际可用的空间只有(9/10)90% 的新生代空间。
- 新生代 和老年代值的比例 1:2(能够经过调节参数 -XX NewRatio)
- 老年代占堆大小的 2/3.
- 新生代的Eden 区域用来存放 新建立的对象,2个Survivor用来屡次回收(新生代垃圾回收频繁) 。
- 新生代中执行的垃圾回收称之为 Minor GC (读音
)或者 叫Young GC,中止复制算法,每一次Young GC后留下来的对象age加1。
- 老年代用于存放新生代中通过屡次垃圾回收仍然存活的对象,对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,能够经过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。
- 当老年代被放满的以后,虚拟机会进行垃圾回收,称之为Major GC。因为Major GC除并发GC外均需对整个堆进行扫描和回收,所以又称为Full GC。
- 整个堆大小=年轻代大小 + 老年代大小。堆内存默认为物理内存的1/64(<1GB);默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,能够经过MinHeapFreeRatio参数进行调整;默认空余堆内存大于70%时,JVM会减小堆直到-Xms的最小限制,能够经过MaxHeapFreeRatio参数进行调整。
-
- 参数比例:
- 最大堆内存 -Xmx:
- 初始时堆内存 -Xms:
- 年轻区内存 -XX MaxNewSize:
- 初始时年轻区内存 -XX NewSize: 一般为max 的1/3 或 1/4 . 新生代=Eden+2个Survivor空间,实际可用空间Eden+1个Survivor 90%。
- 老年区和新生区比例 -XX NewRatio
- 新生代中Eden和Survivor 的比例 -XX SurvivorRatio
- 最大持久带内存 -XX:MaxPermSize
- 初始时持久带内存 -XX:PermSize
- 打印GC 信息 -XX:+printGCDetails
-
-XX:+UseSerialGC:设置串行收集器java
-
-XX:+UseParallelGC:设置并行收集器算法
-
-XX:+UseParalledlOldGC:设置并行年老代收集器数据结构
-
-XX:+UseConcMarkSweepGC:设置并发收集器多线程
- 垃圾回收算法
- 标记-整理(老年代区域使用)
- 分两个阶段,第一个阶段从根节点开始标记全部被引用的对象
- 第二个阶段遍历整个堆,清除没有被标记的对象,压缩整理使用的对象到一小块区域
- 复制:将整个内存划分为两个区域,只会使用一个区域,
- 标记-清除:分两个阶段,第一个阶段从根节点开始标记全部被引用的对象,第二阶段,遍历整个堆,清除没有被标记的对象,
- 缺点 内存碎片
- 引用计数:原理是此对象有一个引用,即增长一个计数,删除一个引用则减小一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是没法处理循环引用的问题,在方法区使用。
参考博客:http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html并发