嗯...我司由于比较操蛋的原因,现在需要考虑面试的一些东西了...希望通过每天写点东西的形式来把自己的知识体系梳理一下,并为以后可能的面试做准备吧..
今天先复习一下JVM GC有关的东西吧。下午内部面试的时候问了个问题:如果现在的hardware的memory不能改,但是程序频繁的FULL GC,怎么破?
嗯。。没啥头绪,网上一般都是说先打开gc log.
我觉得有必要先复习一下JVM GC的一些基础吧。。
首先我们搞清楚JVM的运行时数据区分为以下几大块
堆
堆是JVM的核心区域,用于存储对象实例。大多数的GC发生在这里。
方法区
方法区存储着class的信息。例如:类的名字,修饰符,静态变量,final修饰的变量,构造函数,字段,方法等。
运行时常量池也是方法区的一部分.String.intern()会在运行时常量池分配一个字符串在此区域。
虚拟机栈
生命周期和线程一样。每个方法调用都会产生一个栈帧(stack frame)放入栈中。
栈帧会存放临时变量表,动态链接,方法出口,操作数等信息。
本地方法栈
本地方法栈用于存储本地方法栈帧
程序计数器
用于存储当前线程执行虚拟机字节码指令地址。划分在CPU,线程私有。
如果调用的是本地方法,则是null。
唯一一个不会产生OOM的区域。
今天先复习到这里吧。。。
网友评论