不同的jvm参数可以在gc信息中显示出不同的内容,我们先来学习以下简单的gc信息.
开启-XX:+PrintGCDetails参数,运行java程序查看gc信息
[GC (System.gc()) [PSYoungGen: 523K->368K(4608K)] 523K->376K(15872K(可用堆大小)), 0.0014747 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (System.gc()) [PSYoungGen: 368K->0K(4608K)] [ParOldGen: 8K->297K(11264K)] 376K->297K(15872K), [Metaspace: 2643K->2643K(1056768K)], 0.0043307 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Heap PSYoungGen(新生代大小) total 4608K, used 0K [0x00000007bfb00000, 0x00000007c0000000, 0x00000007c0000000] (三个16进制数据分别代表下界,当前上界,上界) 上界-下届= 堆空间的最大值; 当前上界-下界=已为虚拟机分配的空间;上界=当前上界 说明已经没有扩展空间了 eden space 4096K, 0% used [0x00000007bfb00000,0x00000007bfb00388,0x00000007bff00000) from space 512K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007bff80000) to space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000] ParOldGen (老年代大小) total 11264K, used 297K [0x00000007bf000000, 0x00000007bfb00000, 0x00000007bfb00000) object space 11264K, 2% used [0x00000007bf000000,0x00000007bf04a698,0x00000007bfb00000] Metaspace ((方法区大小)) used 2649K, capacity 4486K, committed 4864K, reserved 1056768K class space used 287K, capacity 386K, committed 512K, reserved 1048576K
GC 信息的相关参数
-XX:+PrintHeapAtGC,可以查看GC回收前后的堆信息 -XX:+PrintGCTimeStamps 打印GC发生的时间戳,相对于虚拟机的启动时间 -XX:+PrintReferenceGc 可以查看软饮用,弱引用,虚引用和Finallize队列 -XLoggc:log/gc.log 指定gc日志以文件形式输出 -verbose:gc 开启gc跟踪 -verbose:class 跟踪类的加载和卸载等价于-XX:+TraceClassLoading和 -XX:+TraceClassUnloading -XX:+PrintCommandLineFlags可以打印出虚拟机的显式和隐式参数
新生代老生代参数测试
-Xms:最小堆内存(初始分配的) -Xmx:最大堆内存(超过这个就会内存溢出) -Xmn:新生代的大小 -XX:SurvivorRatio 设置eden空间和from/to空间的比例大小 -XX:NewRatio=老年代/新生代
jvm参数:-Xms15m -Xmx15m –Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails public static void main(String[] args) throws InterruptedException { byte[] b = null; for(inti = 0 ;i< 10 ;i++){ b = newbyte[1*1024*1024]; } }
SurvivorRatio = eden/from =2;
可用的=eden+from
总共的=eden+from+to
由于eden只有512k,不足以分配1m的空间,所以所有的都分配在老年代
[GC (Allocation Failure) [PSYoungGen: 512K->432K(1024K)] 512K->440K(15872K), 0.0014905 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] Heap PSYoungGen total 1024K, used 457K [0x00000007bfe80000, 0x00000007c0000000, 0x00000007c0000000) eden space 512K, 5% used [0x00000007bfe80000,0x00000007bfe86798,0x00000007bff00000) from space 512K, 84% used [0x00000007bff00000,0x00000007bff6c010,0x00000007bff80000) to space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000) ParOldGen total 14848K, used 10248K [0x00000007bf000000, 0x00000007bfe80000, 0x00000007bfe80000) object space 14848K, 69% used [0x00000007bf000000,0x00000007bfa020a0,0x00000007bfe80000) Metaspace used 2645K, capacity 4486K, committed 4864K, reserved 1056768K class space used 286K, capacity 386K, committed 512K, reserved 1048576K
-Xms20m -Xmx20m -Xmn6m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
如果eden有足够的空间,所有的内存都会在eden分配
-Xms20m -Xmx20m -XX:NewRatio=2 -XX:+PrintGCDetails
这样新生代为6m 老年代为13m,from空间为600k,新生代回收的时候需要老年代进行空间担保.
堆溢出的处理
如果堆空间不足,就会outofmemory:Java Heap Space.使用参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/zcf1/Downloads/test.dump
导出发生内存溢出时,整个堆的信息.“-XX:OutOfMemoryError=脚本路径 %p”
脚本内容(进程信息)
…bin/jstack –F %l > 路径/a.txt
直接内存配置
-XX:MaxDirectMemorySize,默认是-Xmx,达到MaxDirectMemorySize时候就会触发垃圾回收。
直接内存的优势在于读写速度快于堆内存,下面程序用来测试直接内存和堆内存性能的比较.
public class AccessDirectBuffer { public static void directAccess(){ long begin = System.currentTimeMillis(); ByteBuffer b = ByteBuffer.allocateDirect(500); for(int i = 0 ;i< 10000000;i++){ for(int j =0 ;j< 99;j++){ b.putInt(j); } b.flip(); for(int j =0 ;j< 99;j++){ b.getInt(); } b.clear(); } long end = System.currentTimeMillis(); System.out.println("Direct:"+(end-begin)); } public static void bufferAccess(){ long begin = System.currentTimeMillis(); ByteBuffer b = ByteBuffer.allocate(500); for(int i = 0 ;i< 10000000;i++){ for(int j =0 ;j< 99;j++){ b.putInt(j); } b.flip(); for(int j =0 ;j< 99;j++){ b.getInt(); } b.clear(); } long end = System.currentTimeMillis(); System.out.println("buffer:"+(end-begin)); } public static void main(String[] args) { bufferAccess(); directAccess(); } }
相关推荐
本文将详细介绍一些常用的JVM参数设置,这些参数适用于线上关键业务系统,并且具有较高的通用性。 #### 二、学习资源推荐 1. **开源项目启动脚本**:参考成熟的开源项目如ElasticSearch和Cassandra的启动脚本可以...
### JVM配置参数详解 在Java虚拟机(JVM)的运行过程中,通过一系列的命令行参数,我们可以调整其性能和行为。以下是对JVM部分关键配置参数的详细解析,这些参数能够帮助我们优化应用程序的执行效率,管理内存,...
第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...
第二课 JVM运行机制简介 堆、栈、方法区等 JVM启动流程 内存模型和volatile实例 解释和编译运行的概念 介绍JVM的内部结构、启动流程以及内存模型。并介绍JVM字节码的执行方式。 第三课 常用JVM参数 堆的分配参数 ...
《JVM高级特性与最佳实践(第2版)》是一本深入探讨Java虚拟机(JVM)技术的书籍,其源代码提供了丰富的实践案例和示例,帮助读者更直观地理解JVM的工作原理和优化技巧。以下是根据书名和描述所涉及的一些关键知识点...
本篇学习笔记主要介绍如何利用一系列工具来查看和监控JVM的各种运行时信息,包括但不限于JVM进程与参数查看、垃圾收集信息、JVM锁信息等内容。 #### 二、查看JVM进程及参数 ##### 1. JPS - **用途**:列出主机上...
【标题】: "第04章 大促高并发系统下JVM如何调优指导03.pdf" 在大型促销活动期间,高并发系统的性能优化至关重要,尤其是Java虚拟机(JVM)的调优,它直接影响应用程序的响应速度和稳定性。本章节主要探讨了在亿级...
### JAVA高级知识——JVM篇 #### 一、JVM内存模型 JVM(Java Virtual Machine,Java虚拟机)作为Java程序的运行环境,其内存管理机制是理解JVM的关键。JVM内存主要分为以下几个部分: 1. **程序计数器(Program ...
第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。第4~5章介绍了垃圾回收的算法和各种垃圾回收器。第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了...
通过命令行参数`-XX:+UseConcMarkSweepGC`启用并发标记扫描收集器,这是一种常用的并发收集器。 #### 三、垃圾回收类型 根据回收的目标范围不同,JVM中的垃圾回收可以分为以下两种类型: - **Scavenge GC**:当新...
如果是TCP参数设置不当,可以调整TCP参数以提高网络效率。 3. **内存泄漏**:使用`MAT`等工具离线分析dump文件,查找内存泄漏的具体位置;也可以通过`jmap`命令获取堆内存快照,进一步排查可能的泄漏源。 4. **GC...
也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除标记对象,并未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。 垃圾回收策略 常见的垃圾回收策略有: * 增量...
├─4.04 jvm虚拟机常识-jvm虚拟机参数类型-常用的jvm参数.mp4 ├─4.05 java细腻及讲解-jvm虚拟机常识-常用垃圾回收算法.mp4 ├─4.06 jvm运维实用排障工具.mp4 ├─4.07 jvm运维实用排障工具-jps-jstack.mp4 ├─...
- **jprofiler**:第三方强大的JVM性能分析工具。 通过阅读《JVM高级特性与最佳实践2.0》,读者能够深入了解JVM的工作原理,掌握性能优化技巧,从而提升Java应用的稳定性和效率。书中还可能涉及更多实战案例和故障...
在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。 2.3.复制收集器 这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,jvm生成的新对象则放在另一半空间中。gc...
使用JVM内置的JConsole、VisualVM或者第三方工具如JProfiler,可以实时监控JVM的内存使用、线程状态、CPU负载等信息,帮助诊断性能问题。 5. **Linux监测工具**: 在Linux环境中,可以通过top、ps、htop等命令...
7. **JVM参数设置**:熟练掌握常用JVM参数,如`-Xms`和`-Xmx`设定堆内存大小,`-XX:NewRatio`控制年轻代和老年代的比例,`-XX:+UseConcMarkSweepGC`启用特定GC等。 8. **性能监控工具**:使用JDK自带的JVisualVM、...
包括但不限于体系结构、虚拟机的调试方式、常用参数、垃圾回收系统、Class文件结构、执行系统等,力求从多角度更专业地对Java虚拟机进行探讨。 4. 通俗易懂。简单的白话文风格贯穿全书,尽量做到读者在阅读过程中...