基础总结:https://572327713.iteye.com/admin/blogs/2405671/edit
引用
Java HotSpot(TM) 64-Bit Server VM (25.60-b23) for linux-amd64 JRE (1.8.0_60-b27), built on Aug 4 2015 12:19:40 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)
Memory: 4k page, physical 8027744k(2874184k free), swap 1048572k(606224k free)
CommandLine flags: -XX:InitialHeapSize=2197815296 -XX:MaxHeapSize=4294967296 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:ThreadStackSize=512 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
{Heap before GC invocations=1 (full 0):
PSYoungGen total 626176K, used 504919K [0x000000076ab00000, 0x0000000796580000, 0x00000007c0000000)
eden space 537088K, 94% used [0x000000076ab00000,0x0000000789815c90,0x000000078b780000)
from space 89088K, 0% used [0x0000000790e80000,0x0000000790e80000,0x0000000796580000)
to space 89088K, 0% used [0x000000078b780000,0x000000078b780000,0x0000000790e80000)
ParOldGen total 1431040K, used 0K [0x00000006c0000000, 0x0000000717580000, 0x000000076ab00000)
object space 1431040K, 0% used [0x00000006c0000000,0x00000006c0000000,0x0000000717580000)
Metaspace used 20875K, capacity 21152K, committed 21248K, reserved 1067008K
class space used 2959K, capacity 3071K, committed 3072K, reserved 1048576K
2018-12-20T21:27:07.422+0800: 6.322: [GC (Metadata GC Threshold) [PSYoungGen: 504919K->18844K(626176K)] 504919K->18932K(2057216K), 0.0333382 secs] [Times: user=0.06 sys=0.02, real=0.03 secs]
Heap after GC invocations=1 (full 0):
PSYoungGen total 626176K, used 18844K [0x000000076ab00000, 0x0000000796580000, 0x00000007c0000000)
eden space 537088K, 0% used [0x000000076ab00000,0x000000076ab00000,0x000000078b780000)
from space 89088K, 21% used [0x000000078b780000,0x000000078c9e7260,0x0000000790e80000)
to space 89088K, 0% used [0x0000000790e80000,0x0000000790e80000,0x0000000796580000)
ParOldGen total 1431040K, used 88K [0x00000006c0000000, 0x0000000717580000, 0x000000076ab00000)
object space 1431040K, 0% used [0x00000006c0000000,0x00000006c0016010,0x0000000717580000)
Metaspace used 20875K, capacity 21152K, committed 21248K, reserved 1067008K
class space used 2959K, capacity 3071K, committed 3072K, reserved 1048576K
}
{Heap before GC invocations=2 (full 1):
PSYoungGen total 626176K, used 18844K [0x000000076ab00000, 0x0000000796580000, 0x00000007c0000000)
eden space 537088K, 0% used [0x000000076ab00000,0x000000076ab00000,0x000000078b780000)
from space 89088K, 21% used [0x000000078b780000,0x000000078c9e7260,0x0000000790e80000)
to space 89088K, 0% used [0x0000000790e80000,0x0000000790e80000,0x0000000796580000)
ParOldGen total 1431040K, used 88K [0x00000006c0000000, 0x0000000717580000, 0x000000076ab00000)
object space 1431040K, 0% used [0x00000006c0000000,0x00000006c0016010,0x0000000717580000)
Metaspace used 20875K, capacity 21152K, committed 21248K, reserved 1067008K
class space used 2959K, capacity 3071K, committed 3072K, reserved 1048576K
2018-12-20T21:27:07.455+0800: 6.355: [Full GC (Metadata GC Threshold) [PSYoungGen: 18844K->0K(626176K)] [ParOldGen: 88K->18062K(1431040K)] 18932K->18062K(2057216K), [Metaspace: 20875K->20875K(1067008K)], 0.0751691 secs] [Times: user=0.19 sys=0.02, real=0.07 secs]
Eden区和一个survivor0(survivor1)区默认比列是8:1;
比例如果大一点:survivor无法满足,频繁进入老年代
比例如果小一点:频繁进行minnor gc,有可能直接进入老年代
复制算法是怎样实现的:
在新生代中把存活eden和s0区的对象复制到s1区,同时清空eden和s0.
对象以链表存储,把含有与根引用节点间接或直接引用的对象拷贝到新的空间,同时删除之前链表。
判断链表根结点间接和直接引用的队象 就是 可达性分析。
pgrep -l java
jmap -histo 16113 | more
什么时候触发minor gc
当eden区没有组后空间进行分配,比如Eden已经占用了60%,a4对象特别大,不足以分配发生了gc。
什么时候放到老年代
1.大对象直接进入老年代
-XX:PretenureSizeThreshold 参数,大于这个值的对象直接在老年代分配。
2.长期存活的进入老年代
在survivor熬过minor gc(默认15次),可通过-XX:MaxTenuringThreshold设置
3.动态对象年龄判定
在Survivor中,所有相同年龄对象大小综合大于Survivor一半,那么大于等于次奶奶了对象直接进入老年代,无需等XX:MaxTenuringThreshold。
分配担保机制
年轻代如果过大,大于了老年代,会进行full gc。如果设置此值不会
-XX:-HandlePromotionFailure 不允许担保失败
安全:老年代可用空间小于新生代对象总空间时,
允许担保失败:会继续检查老年代可用空间大于历次老年代大小,如果大于(安全)进行Minor gc,
小于或者不允许担保失败,进行Full gc
永久区,然后1.8做了什么改进
永久区在1.8后移除了,同时增加了元区,存储的位置发生变化(元空间不在虚拟机中,在本地内存)。
方法区会不会gc
会,方法区存放永久区
对方法区和永久区的理解,之间的关系
方法区:类的方法代码,常量,静态变量,方法名,访问权限,返回值
方法区是jvm标准中定义的一部分,永久区是hotspot实现方法区的方式,在hotspot中方法区等同永久区
永久带(实现)是对方法区(标准)的实现,是实现层面的东西
类变量与局部变量是否需要赋值: jvm 241
类加载:加载,验证,准备,解析,初始化,使用,卸载。
类变量可以不赋值,因为有两次过程(准备,初始化)会给其赋值,
局部变量必须赋值,否则验证中字节码检验会被虚拟机发现。
对象分配规则:
1.对象优先分配在Eden区,如果Edien区没有足够的空间时,虚拟机执行一次MinorGC。
2.大对象直接进入老年代,目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法手机内存)。
3.长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次MinorGC那么对象进入Survivor区,之后没经过一次MinorGC那么对象的年龄+1,直到达到阈值对象进入老年区。
4.动态判断对象的年龄。如果Survivor区中相同年龄的的所有对象大小综合大于Survivor空间一半,年龄大于等于该年龄的对象可以直接进入老年代。
5.空间分配担保,每次进行MinorGC时,jvm会计算Survivor区移至老年区的对象平均大小,如果这个值大于老年区的剩余值大小则进行一次FullGC,如果小区检擦HandlePromotionFailure设置,如果true则只进行MonitorGC,如果false则进行FullGC。
分享到:
相关推荐
### JVM基础知识精讲 #### 一、JVM概述与HotSpot简介 Java虚拟机(JVM)是Java技术的核心组成部分之一,它为Java程序提供了运行时环境。本节将详细介绍JVM的基本概念及其核心技术——HotSpot。 **HotSpot VM** 是...
本资料《JVM基础-超清文字版.pdf》将深入探讨JVM的基础知识,包括其架构、内存模型、类加载机制以及性能优化等方面。 1. **JVM架构** - 类装载器:负责加载类文件到JVM中,分为引导类加载器、扩展类加载器和应用类...
### JVM基础知识详解 #### HotSpot简介 HotSpot作为Oracle(原属SUN)的主要Java虚拟机实现,自2006年起开源,并成为OpenJDK项目的核心组成部分。它主要使用C++编写,支持多种操作系统和硬件架构。HotSpot的一个...
JVM基础部分通常会涵盖以下几个关键知识点: 1. **JVM结构**:JVM由类加载器、运行时数据区、执行引擎、本地方法接口和本地库组成。理解这些组成部分的功能对于理解JVM如何工作至关重要。 2. **类加载机制**:包括...
### JVM基础知识及性能调优 #### 一、JVM架构概览 Java虚拟机(JVM)作为Java程序运行的基础环境,其内部结构复杂且高效。理解JVM的基础知识对于优化Java应用程序至关重要。JVM主要由以下几个关键部分组成: 1. **...
了解并掌握这些JVM基础知识对于编写高性能、低内存消耗的Java程序至关重要。开发者可以通过理解JVM的工作原理,优化代码,避免内存溢出,提升应用的运行效率。此外,对JVM的深入研究也能帮助我们更好地理解Java平台...
JVM基础内存模型调优了解 JVM基础内存模型是Java虚拟机(JVM)中的一种内存组织方式,主要包括程序计数器、Java虚拟机栈、本地方法栈、堆区和方法区五个部分。这五个部分都是JVM中非常重要的组成部分,分别承担着...
### JVM基础系列——深入了解Java虚拟机的重要性 #### 一、引言 随着Java技术的不断发展,Java虚拟机(JVM)已成为软件开发人员不可或缺的核心技能之一。对于初学者而言,掌握JVM的基础知识不仅可以帮助深入理解Java...
JVM基础知识与调优是每一个Java开发者都需要掌握的重要技能。这个“jvm-training”资料包涵盖了JVM的核心概念、内存管理、垃圾回收机制、性能优化等方面的知识。 1. **JVM架构** - 类加载器:JVM通过类加载器将....
"JVM 基础知识点" JVM(Java Virtual Machine)是 Java 语言的运行环境,负责执行 Java 字节码。 JVM 的主要组件包括类加载器、字节码验证器、执行引擎和垃圾回收器等。 1. JVM 参数分类 JVM 参数可以分为三类:...
### JVM基础 #### 1. JVM概述 - **定义**:Java虚拟机(JVM)是一种用于执行Java字节码的虚拟机。它为运行Java应用程序提供了一个平台无关的环境。 - **作用**:JVM的主要职责是将编译后的Java代码转换成平台特定的...
### JVM基础知识详解 #### JVM加载类的过程与机制 JVM(Java虚拟机)在加载类的过程中,遵循了一系列明确且有序的步骤。对于开发者而言,理解这些步骤有助于更好地掌握类加载的内部工作原理。 ##### 类加载的过程...
java virtual machine JVM基础概念和垃圾回收原理,jvm调优的基本指南
JVM基础理解,以做成xmind欢迎分享
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在...
### JVM基础原理详解 #### 什么是JVM? Java虚拟机(JVM)是一种运行环境,它为Java程序提供了一个统一的平台,使Java程序能够跨平台运行。JVM的主要功能包括执行字节码、管理内存、处理异常以及提供平台独立性。 ...
JVM的基础知识涵盖了其内存模型、垃圾回收机制、线程模型等多个方面,下面将详细总结这些基础知识。 ### JVM内存模型 JVM内存模型主要可以分为线程共享区域和线程私有区域。 **线程共享区域** 1. 堆(Heap):...