深入java虚拟机

1.基本类型在栈中,对象类型存储在堆中;
2.程序运行在栈中,程序运行可以没堆,但不能没有栈;
3.栈大小设置-Xss,太小会出现java.lang.StackOverflowError异常(无法返回的递归);
4.一个空Object对象的大小是8byte,因此Object obj = new Object();占用总的内存大小是4byte+8byte(其中4byte是java栈中保存的引用的所需要的空间),无论什么样的对象都必须大小8byte;
5.java在对对象分配内在时都是以8的整数倍来分的,如
  Class NewObj{
 int count;
 boolean flag;
 Object o;
  }
  其大小为: 空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte, 17最接近于整倍24,因此此对象大小是24byte;
6.一个基本类型包装类的大小至少是16byte,因此1.5以前尽量少使用包装类(基本类型的N位大小),jdk1.5后优化;
7.引用类型:强引用(常见),软引用,弱引用,虚引用;
8.垃圾回收算法按照基本回收策略分:
(1)引用计数:收集计数为0的对象,无法处理循环引用;
(2)标记-清除(Mark-Sweep):第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的
对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
(3)复制(Copying):此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在
使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制
过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两
倍内存空间。
(4)标记-整理(Mark-Compact):此算法结合了“标记-清除”和“复制”两个算法的优点。
9.按分区对待的方式分:
(1)增量收集(Incremental Collecting):实时垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么
原因JDK5.0中的收集器没有使用这种算法的。
(2)分代收集(Generational Collecting)::基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青
代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回
收器(从J2SE1.2开始)都是使用此算法的。
10.垃圾回收从哪儿开始的呢?
栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线
程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。
除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为
起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引
用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多
个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回
收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。
11.虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代
(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系
不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
12.年轻代(Young Generation):分三个区(Eden, Survivor(两个对称的), Tenured);
新生对象->Eden->Survivor->对称Survivor->Tenured区;
13.年老代(Old Generation):在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的
都是一些生命周期较长的对象。
14.持久代:用于存放静态文件,如今Java类、方法等。持久代大小通过-XX:MaxPermSize=<N>进行设置;
15.GC有两种类型:Scavenge GC和Full GC;
16.Scavenge GC:当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,
清除非存活对象,并且把尚且存活的对象移动到Survivor区,不会影响年老代;
17.Full GC: 对整个堆进行整理,包括Young、Tenured和Perm,Full GC会暂停应用;
18.串行收集器使用-XX:+UseSerialGC打开;
19.并行收集器:
对年轻代进行并行垃圾回收,因此可以减少垃圾回收时间。一般在多线程多处理器机器上使用。使用-
XX:+UseParallelGC.打开。并行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中进行了增强--可以对年老
代进行并行收集。如果年老代不使用并发收集的话,默认是使用单线程进行垃圾回收,因此会制约扩展能力。
使用-XX:+UseParallelOldGC打开。
使用-XX:ParallelGCThreads=<N>设置并行垃圾回收的线程数。此值可以设置与机器处理器数量相等。
最大垃圾回收暂停:指定垃圾回收时的最长暂停时间,通过-XX:MaxGCPauseMillis=<N>指定
吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值,通过-XX:GCTimeRatio=<N>来设定,公式为1/(1+N)。
20. 启动并发收集器:因为并发收集在应用运行时进行收集,所以必须保证收集完成之前有足够的内存空间供程
序使用,否则会出现“Concurrent Mode Failure”。通过设置-XX:CMSInitiatingOccupancyFraction=<N>
指定还有多少剩余堆时开始执行并发收集
21.常见配置汇总:
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年
轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示
Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

 

很不错的一本,标记一下:

http://hllvm.group.iteye.com/group/wiki/pdfs

下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值