JVM调优知识

JVM调优知识

一、一些概念
1、数据类型
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型(字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double)的变量保存原始值,而引用类型的变量保存引用值。引用值代表了某个对象的引用,而不是对象本身。

2、堆(stack)与栈(heap)
栈是运行时的单位,而堆是存储的单位。
栈解决的是程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
第一,软件设计角度来看,栈代表了处理逻辑,而堆代表了数据。分而治之、隔离、模块化的思想。
第二,堆与栈的分离,使得堆中的内容可以被多个栈共享。此处益处就是共享内存,节省了栈空间,缺点是会产生并发问题。
第三,栈只能向上增长,限制了栈存储内容的能力;而堆不同,堆中的对象可以根据需要动态增长的,因此堆和栈的拆分使得动态增长成为了可能。
第四,面向对象就是堆和栈的完美结合。我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。

堆中存什么?栈中存什么?
堆中存的是对象,栈中存的是基本数据类型和堆中对象的引用。为何不把基本类型放堆中呢?因为其占用的空间一般是1-8个字节需要的空间比较小,而且因为是基本类型,所以不会出现动态增长的情况,因此栈中存储就够了。


Java中的参数传递时传值呢?还是传引用?
程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题,不会直接传对象本身。
堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。

Java中,栈的大小通过-Xss来设置。栈中存储的数据比较多时,会出现java.lang.StackOverflowError异常。


堆的划分
一块内存分为
e区:所有新创建new的对象
挽救区:分为s0和s1区(这两个区域采用复制算法)
old:老生代

大致过程:
e区有A/B/C/D四个对象,当进行一次ygc之后,A/B被回收了,那么C/D就有在挽救区中选择一个存放,比如s0区,此刻又产生了E/F/G三个对象,通过一次ygc之后,它可能会把F回收,然后E/G放到s1区,s0区此刻对象数为0,然后再通过一次ygc之后,就会放到old区。


3、引用类型
对象引用类型分为强引用、软引用、弱引用及已经摒弃的虚引用。
强引用:我们声明对象时虚拟机生成的引用,不会被垃圾回收。
软引用:一般作为缓存来使用。
弱引用:跟软类似,区别是在进行垃圾回收时,其一定会被回收掉的


二、基本垃圾回收算法

按照基本回收策略分
1:引用计数
比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。
2:标记-清除
此算法执行分两个阶段:一阶段从引用根节点开始标记所有被引用的对象,二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。
3:复制
把内存空间划分为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域。
此算法每次只处理正在使用中的对象,因此复制成功比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍的内存空间。
4:标记-整理
结合了标记-清除和复制两个算法的优点。
两个阶段:一阶段从引用根节点开始标记所有被引用的对象;
二阶段遍历整个堆,把未标记的对象清除并且把存活对象“压缩”
到堆的其中一块。

按系统先成分:
串行收集:使用单线程处理,实现容易,局限性在于无法使用多处理器的优势。
并行收集:使用多线程处理,因而速度快,效率高。
并发收集:不同于之前,它不需要暂停整个运行环境,而且暂停时间会因为堆越大而越长。


三、垃圾回收面临的问题
如何区分垃圾
垃圾回收从哪儿开始的呢?
要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。
垃圾回收的起点就是一些根对象(java栈、静态变量、寄存器)。而最简单的Java栈就是Java程序执行的main函数。

虚拟机中共划分为三个代:年轻代、年老代和持久代


GC有两种类型:Scavege GC 和 Full GC
Scavege GC:当新对象生成,并且在(年轻代的)Eden区申请空间失败时。
Full GC:对整个堆进行整理。


四 常见配置汇总

其它学习资源:

resin4 配置的优化

JVM调优之典型配置

jvm调优总结(总结比较全面)

     

猜你喜欢

转载自blog.csdn.net/wulitaot/article/details/81119209
今日推荐