剑指Offer——知识点储备-JVM基础

1、java内存与内存溢出

1.1 JVM分为哪些区,每一个区干嘛的?(见java虚拟机38页)

  • (1)程序计数器(线程私有)

    当前线程执行字节码的信号指示器。(每个线程都会在程序计数器中存储其指令,从而实现线程切换后恢复到正确的执行位置)
  • (2)虚拟机栈(就是常说的栈,线程私有)

    每个方法执行(开始到结束就是这个方法的生命周期)都会创建一个栈帧,栈帧存储局部变量表、操作数栈、动态链接、方法出口等信息。

    1)(栈内存)为虚拟机执行java方法服务:方法被调用时创建栈帧–>局部变量表–>局部变量–>对象引用

    2)如果线程请求的栈深度超出了虚拟机所允许的深度,就会出现StackOverFlowError. -Xss规定了栈的最大空间;

    3)虚拟机栈可以动态扩展,如果扩展到无法申请到足够的内存,会出现OOM(OutOfMemoryError)

      而我们最常用的就是局部变量表,局部变量表包括如下内容:

    1)基本数据类型: boolean byte char short int float long double

    注意基本类型的包装类型:Boolean、Byte、Character、Short、Integer、Float、Long、Double

    2) 对象引用类型:类、接口、数组 (不是对象本身,可能是一个指向对象起始地址的引用指针)

      问题:包装类型是放在栈中么:String Interget(看包装类型是怎么用的:若直接定义则内容在常量池中,若new一个对象则在堆中)

  • (3)本地方法栈 与虚拟机实现的功能非常相似,不同之处在于虚拟机执行java方法(字节码)服务,而本地方法栈执行Native 方法服务(非java方法写的)。

  • (4)java 堆(线程共享) 虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,对象在失去引用,就会被java虚拟机回收.

1)被所有线程共享,在java虚拟机启动时创建,几乎所有的对象实例都存放到堆中;

2)GC管理的主要区域;

3)物理上不连续,逻辑上连续,并可以动态扩展,无法扩展时抛出OutOfMemoryError;

  • (5)方法区(线程共享)(虚拟机把方法区叫做永久代)

    用于存储已被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据。
  • 注意:特别注意静态变量static修饰的变量在方法区。

1)运行时常量池(是方法区的一部分)

常量不一定只有在编译器产生,在运行期也可以(如String的intern(方法))。

  • (6)直接内存(了解即可)

    不是虚拟机运行时数据区的一部分。是native函数直接分配的堆外内存,这样避免了java堆和native堆来回复制数据。

2、垃圾收集器与内存分配策略

2.1 jvm垃圾处理方法(标记清除、复制、标记整理)

  • 标记—清除算法
  • (1)标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的视为垃圾对象;

    (2)清除阶段:清除所有未被标记的对象。
  • 复制算法

    将原有的内存空间分成两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中存活对象复制到未使用的内存块中,然后清除正在使用的内存块中所有对象。
  • 标记—整理算法:(若对象存活率比较高,就要进行多次复制,效率比较低)

    (1)标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的视为垃圾对象。

    (2)整理阶段:将所有的存活对象压缩到内存的一端(或向一端移动),之后清理边界所有的空间。
  • 分代收集算法 只是根据对象存活周期的不同将内存划分为几块。一般把java堆分为新生代和老年代。

    新生代大量对象死亡,只有少数对象存活,采用复制算法; 老年代对象存活率高,没有额外空间对它进行分配,故采用标记-清除或标记-整理算法。

三种算法的比较:

  • (1)效率:复制算法 > 标记-整理算法 > 标记-清除算法(此处的效率只是简单的对比时间复杂度)
  • (2)内存整理度:复制算法 = 标记-整理算法 》标记-清除算法
  • (3)内存利用率:标记-整理算法 = 标记-清除算法 》复制算法

2.2 JVM如何GC?新生代,老年代,持久代,都存储哪些东西,以及各个区的作用?

内存的分配

1、大多数新生的对象在Eden区分配,当Eden区没有足够空间进行分配时,虚拟机就会进行一次Minor GC.(Survivor是两个)



新生代:

在方法中new一个对象,方法调用完毕后,对象就会被回收,这就是一个典型的新生代对象。(新生对象在eden区经历过一次minorGC并且被Survivor容纳的话,对象年龄为1,每一次熬过MinorGc 年龄就会加1,直到15,就会晋升到老年代)

注意动态对象的判定:Survivor空间中相同年龄的对象大小总和大于Survivo空间的一半,大于或等于该年龄的对象就可以直接进入老年代。

老年代:

(1)在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代中,而且大对象(占用大量连续内存空间的java对象如很长的字符串及数组)直接进入老年代。

(2)当survivor空间不够用时,需要依赖老年代进行分配担保。

永久代:即方法区

2.3 GC引用可达性分析算法中,哪些对象可作为GCRoots对象?

  • (1)java虚拟机栈中的对象(引用对象);
  • (2)方法区中的静态成员;
  • (3)方法区中的常量引用对象;
  • (4)本地方法区中的JNI(Native方法)引用对象 ;

2.4 什么时候进行MinorGC,FullGC

MinorGC(新生代GC)

当Eden区没有足够空间进行分配时,虚拟机就会进行一次Minor GC.

(1)新生代中的垃圾收集动作,采用的是复制算法;

(2)对于较大的对象(很长的字符串、数据、集合),在Minor GC的时候可以直接进入老年代。

FullGC(老年代GC)

(1)Full GC 是发生在老年代的垃圾收集动作,采用的是标记-清除/整理算法;

(2)由于老年代的对象几乎都是在survivor区熬过来的,不会那么容易死掉,因此Full GC发生的次数不会像MInor GC那么频繁,FullGC清理时间是Minor GC的10倍。

2.5 各个垃圾回收器是怎么工作的

Serial收集器

(1)是一个单线程收集器,它“单线程”的意义并不仅仅说明它只会使用一个cpu或一条线程去完成垃圾回收工作。而是在收集垃圾时,暂停其他的工作线程。

(2)新生代采用复制算法,stop-the-world(消除或者减少工作线程因内存回收而导致停顿)。

(3)老年代采用标记–整理算法。

(4)简单高效,client模式下默认的新生代收集器。

ParNew收集器

(1)ParNew收集器是Serial收集器的多线程版本;

(2)新生代采用复制算法,stop-the-world;

(3)老年代采用标记–整理算法;

(4)它是运行在server模式下首选新生代收集器;

(5)除了serial收集器之外,只能它能和cms收集器配合工作。

ParNew Scanvenge收集器

(1)类似ParNew,但是更加关注吞吐量。目标是:达到一个可控制吞吐量的收集器;
(2)停顿时间和吞吐量不可能同时调优。我们一方面希望停顿时间少,另一方面希望吞吐量高,其实这是矛盾的。
因为:在GC的时候,垃圾回收的工作量是不变的,如果停顿时间减少,那频率就会提高;既然频率提高了,说明就会频繁的进行GC,那吞吐量就会减少,性能就会降低。

G1收集器(核心重点)

(1)是当今收集器发展的最前沿成果之一,对垃圾回收进行划分优先级的操作,这种有优先级的区域回收方法保证了它的高效率;

(2)最大的优点是结合了空间整合,不会产生大量的碎片,也降低了进行GC的频率;

(3)让使用者明确指定停顿的时间。

CMS收集器:(Concurrent Mark Sweep:并发标记-清除 老年代收集器)

(1)一种以获得最短回收停顿时间为目标的收集器,适用于互联网网站或者B/S系统的服务器上;

(2)初始化标记(stop-the-world):根可以直接关联到的对象;

(3)并发标记(和用户线程一起):主要标记过程,标记全部对象;

(4)重新标记(stop-the-world):由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正;

(5)并发清除(和用户线程一起):基于标记结果,直接清理对象。

注意:CMS有三个致命的问题:1、cpu资源占用 2、浮动的垃圾无法清除 3、内存碎片

2.6 java有几种引用类型,什么情况下使用软引用,GC时如何判定哪些软引用需要回收

Java有四种引用类型:

强引用:通过new产生的对象都是强引用。

软引用:一些还有用但不是必须的对象可以使用软引用。比如创建一个软引用数组,这个数组存放了100多个学生对象的信息。内存比较空闲的时候这些对象和强引用没有区别,但内存紧张的时候就会被GC回收。(这就是GC的判定条件)

应用软引用的好处:java在内存不足时,程序不会崩溃;

弱引用:描述非必须对象的(比软引用更弱),当gc工作时,无论内存是否紧张都会回收掉;

实现这个的目的某个对象是偶尔使用,并且在使用时随时能获取,又不想影响垃圾的回收,可以考虑应用这个。

虚引用:无法通过虚引用来获取对一个对象的真实引用。唯一的用处:能在对象被GC时收到系统通知,JAVA中用PhantomReference来实现虚引用。





剑指Offer——知识点储备-JVM基础的更多相关文章

  1. 剑指Offer——知识点储备-Java基础

    剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...

  2. 剑指Offer——知识点储备-网络基础

    剑指Offer--知识点储备-网络基础 计算机网络 http和https的区别 (1)http是http协议运行在tcp之上,所传输的内容都是明文,客户端和服务器端都无法验证对方的身份. (2)htt ...

  3. 剑指Offer——知识点储备-操作系统基础

    剑指Offer--知识点储备-操作系统基础 操作系统 操作系统什么情况下会出现死锁? 产生死锁的必要条件 (1)互斥条件:即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有, ...

  4. 剑指Offer——知识点储备-数据库基础

    剑指Offer--知识点储备-数据库基础 数据库 事务 事务的四个特性(ACID):   原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Dura ...

  5. 剑指Offer——知识点储备-J2EE基础

    剑指Offer--知识点储备-J2EE基础 9.2 jdk 1.8的新特性(核心是Lambda 表达式) 参考链接:http://www.bubuko.com/infodetail-690646.ht ...

  6. 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制

    剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...

  7. 剑指Offer——知识点储备--Linux基本命令+Makefile

    剑指Offer--知识点储备–Linux基本命令 1.linux下查看进程占用cpu的情况(top): 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参 ...

  8. 剑指Offer——知识点储备-常用算法

    剑指Offer--知识点储备-常用算法 快速排序 注:若排序是有序的,采用快排,则退化为冒泡排序. 解决这个问题,采用两个选取基准的方法 (1)随机选取基数(在这个区间内随机取一个数) 出现的恶劣情况 ...

  9. 剑指Offer——知识点储备-设计模式

    剑指Offer--知识点储备-设计模式 设计模式 设计模式的六大原则 (1)单一职责原则(有且仅有一个原因引起类的变化): (2)里氏替换(任何父类出现的地方子类都可以替换): (3)依赖倒置(依赖抽 ...

随机推荐

  1. 关于ES6 的对象解构赋值

    之 前写了关于ES6数组的解构 现在 go on ; 解构不仅可以用于数组,还可以用于对象: 对象的解构和数组有一个重要的不同.数组的元素是按次序排列的,变量的取值是由他的位置决定的:而对象的属性没有 ...

  2. [LeetCode] Circular Array Loop 环形数组循环

    You are given an array of positive and negative integers. If a number n at an index is positive, the ...

  3. 实战分享:如何成功防护1.2T国内已知最大流量DDoS攻击

    作者:腾讯云宙斯盾安全团队&腾讯安全平台部 引言: DDoS攻击势头愈演愈烈,除了攻击手法的多样化发展之外,最直接的还是攻击流量的成倍增长.3月份国内的最大规模DDoS攻击纪录还停留在数百G规 ...

  4. mysql-5.7.18-winx64 免安装版配置

    如题,最新的都是只有免安装版的,可以官网下载zip的压缩包. 下载后解压,如下 下面就开始配置 1.在path中添加环境变量 ;D:\coding\mysql-5.7.18-winx64\bin; ← ...

  5. 控制公司 Controlling Companies

    题目描述 有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分.(此处略去一句废话)据说,如果至少满足了以下三个条件之一,公司A就可以控制公司B了: 公司A = 公司B. 公司A拥 ...

  6. NOIP2014-5-10模拟赛

    Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的 ...

  7. 2015 多校联赛 ——HDU5348(搜索)

    Problem Description As we all kown, MZL hates the endless loop deeply, and he commands you to solve ...

  8. 2015 多校联赛 ——HDU5294(最短路,最小切割)

    Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  9. bzoj 4518: [Sdoi2016]征途

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  10. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...