JVM调优、GC总结

  • 内存分配
    http://blog.csdn.net/shimiso/article/details/8595564 
    http://blog.csdn.net/OyangYujun/article/details/41173747

  • 特殊的内存:非JVM规范的内存区域:直接内存
    直接内存并不是虚拟机规范定义的数据区的一部分,也不是虚拟机运行时数据区的一部分。但是这部分内存也被频繁的使用,而且也可能导致OOM。
    在JDK1.4中新加入了NIO类,引入了一种基于通道与缓冲区的I/O方式。它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场合中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

  • 内存模型
    http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html

判断对象是否存活一般有两种方式:
1. 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
2. 可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。

JVM垃圾回收机制采用有向图方式来管理内存中的对象  
    • 对象在内存中的状态:可达状态、可恢复状态、不可达状态

      • 可达状态:对象被创建后,有一个以上的引用变量引用它时。
      • 可恢复状态:如果对象不再有任何引用变量引用它,将先进入可恢复状态,此时不能从有向图顶点导航到该对象,系统垃圾回收机制准备回收内存,在回收之前系统将调用可恢复状态的对象的finalize方法进行资源清理,若finalize方法能让一个以上的变量引用此对象,则对象会再次变为可达状态,否则进入不可达状态。
      • 不可达状态:当对象所有联系都被切断,且finalize方法没有使该对象变成可达,则对象将永久失去引用。系统会进行回收。
    • Java对对象的引用分4种:强引用、软引用、弱引用、虚引用。

      • 强引用:创建变量并引用;最常用;绝对不会被垃圾回收机制回收,即使内存非常紧张。
      • 软引用:SoftReference;当系统内存足够时不会被系统回收,当系统内存空间不足时,系统将会回收;常用于创建大量某类对象时做优化;
      • 弱引用:WeakReference;当系统垃圾回收时,不管系统内存够不够,总会回收该对象所占内存;
      • 虚引用:不可单独使用,一般配合引用队列使用;主要作用是跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含指定虚引用,从而了解虚引用的对象是否即将被回收。
    • Java常用调试工具和命令

      • 1、jps
        显示系统中所有Hotspot虚拟机进程。
        参数:
        -l :输出主类全名。
        -v:输出虚拟机进程启动的jvm参数。
        -m:输出启动时传递给main函数的参数。
        -q:只输出LVMID,省略主类的名称。

      • 2、jinfo
        显示虚拟机的配置信息,可观察进程运行环境参数,包括Java System属性和JVM命令行参数。
        参数:
        -flag< name >: 打印指定Java虚拟机的参数值。
        -flag [+|-]< name >:设置或取消指定java虚拟机参数的布尔值。
        -flag < name >=< value >:设置指定java虚拟机的参数的值。
        示例:
        ➜ ~ jinfo 10565 
        ➜ ~ jinfo -flag CICompilerCount 10565
        ➜ ~ jinfo -flag +PrintGCDetails
        ➜ ~ jinfo -flag -PrintGCDetails 10532
        ➜ ~ jinfo -flag CMSInitiatingOccupancyFraction=80 10532

      • 3、jstack
        作用:
        显示虚拟机的线程栈信息,用于生成当前JVM的所有线程快照。
        参数:
        -F:当正常输出的请求不被响应时,强制输出线程堆栈。
        -l:除堆栈外,显示关于锁的附加信息。
        -m:如果调用到本地方法的话,可以显示C/C++的堆栈 
        命令格式:jstack [option] vmid。 示例:
        ➜ ~ jstack -F 10532
        ➜ ~ jstack -l 10532
        ➜ ~ jstack -m 10532

      • 4、jstat
        作用:
        实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据。
        参数:
        -class:监视类装载、卸载数量、总空间及类装载所耗费的时间。
        -gc:监听Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量,以用空间、GC时间合计等信息。
        -gccapacity:监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到的最大和最小空间。
        -gcutil:监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
        -gccause:与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因。
        -gcnew:监视新生代GC状况。
        -gcnewcapacity:监视内同与-gcnew基本相同,输出主要关注使用到的最大和最小空间。
        -gcold:监视老年代GC情况。
        -gcoldcapacity:监视内同与-gcold基本相同,输出主要关注使用到的最大和最小空间。
        -gcpermcapacity:输出永久代使用到最大和最小空间。
        -compiler:输出JIT编译器编译过的方法、耗时等信息。
        -printcompilation:输出已经被JIT编译的方法。
        示例:
        ➜ ~ jstat -class 10532 
        ➜ ~ jstat -gc 10532
        ➜ ~ jstat -gccapacity 10532
        ➜ ~ jstat -gcutil 10532
        ➜ ~ jstat -gccause 10532
        ➜ ~ jstat -gcnew 10532
        ➜ ~ jstat -gcnewcapacity 10532
        ➜ ~ jstat -gcold 10532
        ➜ ~ jstat -gcoldcapacity 10532
        ➜ ~ jstat -compiler 10532
        ➜ ~ jstat -printcompilation 10532

      • 5、jmap、jhat
        作用:
        用于生成虚拟机的内存快照信息
        jhat用网页方式查看dump信息 
        参数:
        -dump:生成java堆转储快照。
        -heap:显示java堆详细信息(只在Linux/Solaris下有效)。
        -F:当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照(只在linux/Solaris下有效)。
        -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象(只在Linux/Solaris下有效)。
        -histo:显示堆中对象统计信息。
        -permstat:以ClassLoader为统计口径显示永久代内存状态(只在Linux/Solaris下有效)。
        示例:
        ➜ ~ jmap -heap 10532
        ➜ ~ jmap -histo 10532 | more
        ➜ ~ jmap -F 10532 ➜ ~ jmap -finalizerinfo 10532

      • 6、jconsole
        作用:
        内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。可使用 JConsole来监控 Java 应用程序性能和跟踪 Java 中的代码。

      • 7、gc相关术语
        S0C:S0区容量(S1区相同,略) 
        S0U:S0区已使用
        EC:E区容量
        EU:E区已使用
        OC:老年代容量
        OU:老年代已使用
        PC:Perm容量
        PU:Perm区已使用
        YGC:Young GC(Minor GC)次数
        YGCT:Young GC总耗时
        FGC:Full GC次数
        FGCT:Full GC总耗时
        GCT:GC总耗时

    • jvm参数调优 各个参数意义
      http://www.cnblogs.com/andy-zhou/p/5327288.html
      http://www.cnblogs.com/edwardlauxh/archive/2010/04/25/1918603.html
      http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
      http://blog.csdn.net/rongbo_j/article/details/51107898

    • GC算法
      http://www.cnblogs.com/ityouknow/p/5614961.html
      http://blog.csdn.net/lingzhm/article/details/47174391

    • classloader 委派模型

    • 类加载器产生泄露原因总结。 
      1、永久代内存不足
      2、动态代理类生成大量类

    • 定义自已的类加载器分为两步:
      1、继承java.lang.ClassLoader
      2、重写父类的findClass方法

      为什么只重写findClass方法?
      因为JDK已经在loadClass方法中帮我们实现了ClassLoader搜索类的算法,当在loadClass方法中搜索不到类时,loadClass方法就会调用findClass方法来搜索类,所以我们只需重写该方法即可。如没有特殊的要求,一般不建议重写loadClass搜索类的算法。

转载于:https://www.cnblogs.com/webCrazy/p/7502220.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值