热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jvm调优01

1、java虚拟机内存模型主要分为:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区1.1程序计数器(ProgramCounterRegister):一块较小的内存空间

1、java虚拟机内存模型

  主要分为:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区

  技术分享

  1.1 程序计数器(ProgramCounter Register):

    一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器

    如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;

    如果正在执行的是natvie方法,这个计数器值则为空(undefined)。

    此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError 情况的区域

  1.2 JAVA虚拟机栈(java virtual machine stacks):

    每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息

    java虚拟机栈的局部变量表存放了编译期可知的各种基本数据类型、对象应用和returnAddress类型

    如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常

    如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常

    可以通过-Xss设置栈的大小,其大小决定了函数可调用的深度,值越大,线程数越小

  1.3 本地方法栈(native method stacks):

    为虚拟机使用到的Native 方法服务

  1.4 java堆(java heap):

    主要用来存放对象和数组实例的地方,垃圾回收的主要区域,分为新生代和老年代

    新生代:

      程序刚创建的对象都是从新生代分配内存,新生代

      新生代又可细分为:Eden space区和两块大小相同的幸存区survivor(s0和s1或者from和头)

      可以通过-Xmn指定eden区的大小,通过-XX:SurvirorRation来调整幸存区的大小

    老年代:

      存放多次gc后仍然存活的对象

      新建的对象之间进入老年代的情况:

        ①.大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。

        ②.大的数组对象,切数组中无引用外部对象。

    通过-Xmx设置最大堆内存(新生代和老年代之和),-Xms设置最小堆内存(启动jvm时占用的系统内存的大小),通常将-Xmx和-Xms设置为一样的大小来减少gc的次数

  1.5 方法区

    各个线程共享的内存区域,主要用来存储类的元数据、常量、静态变量、即时编译器编译后的代码等数据

    通过-XX:MaxPermSize设置方法区的最大值-XX:PermSize设置方法区的初始化大小

2、常见的四种垃圾收集器(-XX:+UseParallelGC默认方式)

  2.1 新生代并行收集器(-XX:+UseParNewGC)

    暂停所有应用线程,启动多个线程进行垃圾回收

  2.2 新生代和老年代都用的并行回收器(-XX:+UseParallelOldGC)

    暂停所有应用线程,启动多个线程进行垃圾回收

  2.3 新生代和老年代都用的串行回收器(-XX:+UseSerialGC)

    暂停所有应用线程,启动一个线程进行垃圾回收

  2.4 CMS回收器(-XX:+UseConcMarkSweepGC)

    使用多个线程来扫描堆内存来标记需要回收的实例,然后再清除被标记的实例

3、调优方法

  3.1 新对象预留新生代

    由于fullGC(老年代)的成本远比minorGC(新生代和老年代)的成本大,所以给应用分配一个合理的新生代空间,尽量将对象分配到新生代减小fullGC的频率

  3.2 大对象进入老年代

    将大对象直接分配到老年代,保持新生代对象的结构的完整性,以提高GC效率, 可以通过-XX:PretenureSizeThreshold设置进入老年代的阀值

  3.3 稳定与震荡的堆大小

    稳定的对大小是对垃圾回收有利的,方法将-Xms和-Xmx的大小一致

  3.4 吞吐量优先

    尽可能减少系统执行垃圾回收的总时间,故采用并行垃圾回收器

    -XX:+UseParallelGC或使用-XX:+UseParallelOldGC

  3.5 降低停顿

    使用CMS回收器,同时减少fullGC的次数

4、获取gc信息的方法

  4.1 -verbose:gc或者-XX:+PrintGC  获取gc信息

  4.2 -XX:+PrintGCDetails  获取更加详细的gc信息

  4.3 -XX:+PrintGCTimeStamps  获取GC的频率和间隔

  4.4 -XX:+PrintHeapAtGC  获取堆的使用情况

  4.5 -Xloggc:D:\gc.log  指定日志情况的保存路径


推荐阅读
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 初探性能优化:入门指南与实践技巧
    在编程领域,常有“尚未精通编码便急于优化”的声音。为了从性能优化的角度提升代码质量,本文将带领读者初步探索性能优化的基本概念与实践技巧。即使程序看似运行良好,数据处理效率仍有待提高,通过系统学习性能优化,能够帮助开发者编写更加高效、稳定的代码。文章不仅介绍了性能优化的基础知识,还提供了实用的调优方法和工具,帮助读者在实际项目中应用这些技术。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • 本文详细解析了逻辑运算符“与”(&&)和“或”(||)在编程中的应用。通过具体示例,如 `[dehua@teacher~]$[$(id -u) -eq 0] && echo "You are root" || echo "You must be root"`,展示了如何利用这些运算符进行条件判断和命令执行。此外,文章还探讨了这些运算符在不同编程语言中的实现和最佳实践,帮助读者更好地理解和运用逻辑运算符。 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
  • 蚂蚁课堂:性能测试工具深度解析——JMeter应用与实践
    蚂蚁课堂:性能测试工具深度解析——JMeter应用与实践 ... [详细]
  • 在 iOS 开发中,经常会遇到 `@(YES)`、`@[firstViewController]` 以及 `@{@a:@b}` 这样的语法糖。这些简化的写法分别用于初始化布尔值、数组和字典对象,能够显著提高代码的可读性和编写效率。例如,`@(YES)` 可以快速创建一个布尔值对象,`@[firstViewController]` 则用于创建包含单个元素的数组,而 `@{@a:@b}` 则用于创建键值对字典。理解这些语法糖的使用方法,有助于开发者更加高效地进行编码。 ... [详细]
  • 近日,我在处理一个复杂的前端问题时遇到了极大困扰。具体来说,我之前开发了一个功能丰富的纯jQuery代码的前端GridView控件,实现了多种功能和视觉效果,并在多个项目中表现良好。然而,最近在尝试应用 `border-box` 布局模式时,却遇到了意想不到的兼容性和性能问题。这提醒我们在条件尚未完全成熟的情况下,应谨慎使用 `border-box` 布局模式,以免引入不必要的复杂性和潜在的bug。 ... [详细]
  • 在Eclipse中提升开发效率,推荐使用Google V8插件以增强Node.js的调试体验。安装方法有两种:一是通过Eclipse Marketplace搜索并安装;二是通过“Help”菜单中的“Install New Software”,在名称栏输入“googleV8”。此插件能够显著改善调试过程中的性能和响应速度,提高开发者的生产力。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 深入解析Linux内核中的进程上下文切换机制
    在现代操作系统中,进程作为核心概念之一,负责管理和分配系统资源,如CPU和内存。深入了解Linux内核中的进程上下文切换机制,需要首先明确进程与程序的区别。进程是一个动态的执行流,而程序则是静态的数据和指令集合。进程上下文切换涉及保存当前进程的状态信息,并加载下一个进程的状态,以实现多任务处理。这一过程不仅影响系统的性能,还关系到资源的有效利用。通过分析Linux内核中的具体实现,可以更好地理解其背后的原理和技术细节。 ... [详细]
  • 如何在PDF文档中添加新的文本内容?
    在处理PDF文件时,有时需要向其中添加新的文本内容。这是否可以直接实现呢?有哪些简便且免费的方法可供选择?使用极速PDF阅读器打开文档后,可以通过点击左上角的“注释”按钮切换到注释模式,并选择相应的工具进行编辑。此外,还可以利用其他功能丰富的PDF编辑软件,如Adobe Acrobat DC或Foxit PhantomPDF,它们提供了更多高级的编辑选项,能够满足更复杂的需求。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • Java服务问题快速定位与解决策略全面指南 ... [详细]
author-avatar
别被风景迷了眼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有