Java使用虚拟机的好处知乎_Java虚拟机1(深入理解Java虚拟机)

Java平台与内存管理:

jvm内存区域:堆,方法区,虚拟机栈,本地方法栈,程序计数器,堆和方法区是线程共享的,其余是线程隔离的。1、堆,Java堆主要存放数组对象和实例对象,Java堆也是垃圾回收的主要区域(采用分代垃圾收集方法,所以堆可以细分成新生代和老年代),物理不连续,堆上分配空间主要有指针碰撞(明确的分界线)和空闲列表(表格记载空闲区域)。会抛出OutOfMemoryError.2、方法区,用于存放虚拟机加载的类信息,常量,静态变量,编译后的代码,运行时常量池等。运行时常量池存放编译期生成的字面量和符号引用(字面量包含字符串、八种基本类型数据、final常量,符号引用包含类和方法名称、字段名称和描述符、方法名称和描述符),相较于class常量池是动态的。空间不足抛出OutOfMemoryError。3、虚拟机栈,方法执行的内存模型,存放局部变量、操作数帧、动态链接和方法出口;每一个方法的调用都代表着一个栈帧从入栈到出栈的过程。虚拟机栈申请不到足够的内存空间报OutOfMemoryError;4、本地方法栈,jvm调用本地方法;5、程序计数器,记录当前线程执行到的字节码行号,无OutOfMemoryError情况

如何判断对象已死:引用计数法和可达性分析法,1、引用计数法就是该对象被引用一次加一,引用失效减一,计数器值为0则对象死亡,但是无法解决对象循环引用的问题;2、可达性分析法:通过一系列GC Roots的对象作为起点,从起点开始向下搜索,路径称为应用链,当一个对象和GC Roots之间没用任何引用链时该对象死亡;3、但是真正判断一个对象死亡,至少需要经过两次标记过程,不可达的对象经过第一次标记,若该对象没有覆盖finalize方法或者finalize方法被虚拟机调用过,则没必要执行finalize方法,而需要执行的对象被放入一个队列中进行二次标记,若没有对象关联则被回收;

简述强软弱虚引用:1、强引用,垃圾回收器绝不能回收该对象,宁可报OutOfMemoryError;2、软引用,内存空间足够不回收,空间不够才回收。用作内存敏感的高速缓存;3、弱引用,生存至下一次垃圾回收前;4、虚引用,任何时候均能回收;在垃圾回收前,将虚引用加入引用队列中(判断对象是否要被垃圾回收器回收),在垃圾回收后才会将软、弱引用加入回收队列中;

垃圾收集算法及其特点:1、标记清除算法:首先标记出所有需要回收的对象,标记完成后统一清除(效率问题、空间问题);2、复制算法:将内存空间分成大小相同的两块,当其中一块使用完成后,将还存活的对象复制到另一块上,并且将之前一块一次清除,对半回收,这样内存使用效率较低,通常分成Survivor:Eden:Eden = 8:1:1,当Survivor和其中一块Eden使用完成后,将存活对象复制到剩余的Eden中,内存使用效率为90%,若存活对象大于10%,采用分配担保策略:多出来的10%直接进入老年代;3、标记整理算法:同标记清除一样,但是后续不是直接清除,而是将存活对象向一端移动,将端边界以外的内存直接清除;4、分代收集算法(常用):将对象分成新生代和老年代,根据年代特点选择合适的算法;例如新生代死亡率较高,采用复制算法,老年代死亡率较低,采用标记清除或者标记整理算法;

并行和并发的关系:并行,多条垃圾收集线程并行工作,用户线程等待;并发:用户线程跟垃圾收集线程同时执行(交替执行);

垃圾收集器(垃圾收集的具体实现):常用的有Serial(单线程、新生代)、Serial Old(单线程老年代)、ParNew(并行多线程、新生代)、Parallel Scavenge(并行多线程的新生代、侧重吞吐量)、Parallel Old(并行多线程老年代)、CMS(老年代)、G1(同时收集老年代和新生代);

CMS和G1:CMS(spark steaming采用),老年代收集器,为了获得最短停顿时间的收集器,采用标记清除算法,主要包括四个过程:初始标记、并发标记、重新标记和并发清除。初始标记:暂停其他线程,记录与GC Roots相连的对象;并发标记:同时开启GC和用户线程,从GC root向下标记相连对象;重新标记:修正并发标记期间由于用户线程运行而产生的标记更改,该阶段暂停其他线程;并发清除:开启用户线程,同时GC线程清除标记的对象;优点是并发清除,延迟时间短;缺点是1、标记清除产生碎片,2、并发清除期间产生垃圾,3、并发执行期间用户程序降低、吞吐量降低;G1收集器:采用标记整理避免内存碎片,将内存分成多个大小相等的rigon,并且维护一个优先队列,在允许的收集时间内回收最有价值的region,并且对每一个region采用一个remember set记录引用关系,避免可达性分析时全局扫描;过程是初始标记、并发标记、最终标记和筛选回收,最终标记时将对象变化记录在remember set log中,需停顿用户线程,最终将remember set log与remember set合并,筛选回收对每一个region进行筛选,根据GC期望时间回收相应的region;

评判垃圾收集器的效果好坏:1、吞吐量越高算法越好(用户线程时间/CPU总耗时),2、暂停时间越短算法越好

吞吐量优先or暂停时间优先:1、吞吐量优先新生代采用parallel Scavenge,老年代采用parallel Old;2、暂停时间优先老年代采用CMS,新生代采用ParNew;

内存分配和回收策略(何时进入老年代):Minor GC和Full GC之间的区别:Minor GC指代新生代的垃圾收集,频率高,时间短;MajorGC指代老年代垃圾回收;FullGC指代整个空间老年代和新生代的垃圾收集;对象何时进入老年代:1、大对象(需要大量内存的对象)直接进入老年代,2、空间分配担保,采用标记清除算法时,当survivor和Eden均装满后将存活对象复制至Eden,若装不下则剩余直接进入老年代;3、年龄判定,年龄计数器计算年龄,每一次GC后任然存活的对象年龄加1,当超过设定值时进入老年代,或者动态判定若survivor内超过一半的对象年龄超过一个定值则可以直接进入老年代;

虚拟机性能监控和故障处理工具:jps:查看虚拟机运行了那些进程,并输出这些进程id(-m查询虚拟机进程启动时传递给main函数的参数);jmap:可用生成堆内存转存快照dump,它还可以查询finalize执行队列,java堆和永久代的详细信息(histo显示堆中对象的显示信息)3、jstat:内存监控(gc监视堆内存使用情况)4、jinfo:jvm配置信息 5、jvisualvm:可视化监控Java程序性能;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值