JRE = JVM + JAVA SE API
2. 3 famous JVM: HotSpot(Sun), JRocket(BEA), J9(IBM)
3. GC 收集器
Young Generation: Serial, ParNew & Parallel Scavenge
Tenured Generation: Serial Old, Parallel Old & CMS
G1 between Young & Tenured Generation.
4. Heap Space & Non-heap space
Heap Space: Eden Space, Survivor Space & Tenured Space
Non-heap Space: Code Cache, Perm Generation, JVM Stack & Local Method Stack
5. Command Tools
1) jps (JVM Process Status) like linus ps command
2) jstat + -gcutil + vmid
3) jmap (Memory Map for Java): 获取dump文件,查询finalize执行队列,java Heap & Perm 详细信息
4) jmap -dump:format=b,file=
jmap -heap +vmid : detail of heap (only availabe in Linux)
jmap -histo +vmid: 显示堆中对象统计信息,包括类,实例数量,合计容量
5) jhat (JVM Heap Analysis Tool): 与jmap搭配使用,分析堆转储快照(html方式)
但现在更常用Eclipse Memory Analyzer, IBM Heap Analyzer.
6) jstack (Statck Trace for Java): 当前线程快照threaddump
jstatck + vmid
6. JVM内存模型
堆:所有线程共享的,主要用来存储对象。其中,堆可分为:年轻代和老年代两块区域。使用NewRatio参数来设定比例。对于年轻代,一个Eden区和两个Suvivor区,使用参数SuvivorRatio来设定大小;(应用如:加载类ClassLoader.loadClass...)
Java虚拟机栈/ 本地方法栈: 线程私有的,主要存放局部变量表,操作数栈,动态链接和方法出口等;
程序计数器: 线程私有的,记录当前线程的行号指示器,为线程的切换提供保障;
方法区: 线程共享的,主要存储类信息、常量池、静态变量、JIT编译后的代码等数据。方法区理论上来说是堆的逻辑组成部分;
运行时常量池: 是方法区的一部分,用于存放编译期生成的各种字面量和符号引用;
方法区 VS 永久代(Perm Gen)
方法区是JVM的规范,永久代是HotSpot的具体实现
字符串常量池
<=1.6存在方法区中;1.7存在heap中;1.8则存在native memory
class文件常量池
Class 文件常量池指的是编译生成的 class 字节码文件,其结构中有一项是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
运行时常量池
运行时常量池是方法区的一部分,是一块内存区域。Class 文件常量池将在类加载后进入方法区的运行时常量池中存放。一个类加载到 JVM 中后对应一个运行时常量池,运行时常量池相对于 Class 文件常量池来说具备动态性,Class 文件常量只是一个静态存储结构,里面的引用都是符号引用。而运行时常量池可以在运行期间将符号引用解析为直接引用。