这里向大家描述一下JVM内存设置原理和内存调优,设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。
JVM内存设置原理
默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。
java-Xms64m-Xmx256mTest
-Xms是设置内存初始化的大小
-Xmx是JVM内存设置中设置最大能够使用内存的大小(最好不要超过物理内存大小)
在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。简单介绍了JVM内存设置,下面我们看一下JVM内存的调优。
JVM内存的调优
1.Heap设定与垃圾回收
JavaHeap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。JVM的Heap分配可以使用-X参数设定,
JVM有2个GC线程。
第一个线程负责回收Heap的Young区。
第二个线程在Heap不足时,遍历Heap,将Young区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。
为什么一些程序频繁发生GC?有如下原因:
◆程序内调用了System.gc()或Runtime.gc()。
◆一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
◆Java的Heap太小,一般默认的Heap值都很小。
◆频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。
经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3[2]。
2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成[2]。
注意:
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
2.Stack的设定
每个线程都有他自己的Stack。
Xss每个线程的Stack大小
Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
3.硬件环境
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]。
4.4种GC
第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。
第二种为ThroughputGC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
第三种为ConcurrentLowPauseGC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
第四种为IncrementalLowPauseGC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
4种GC的具体描述参见[3]。关于JVM内存设置的内容就介绍到这里,请关注本节其他相关报道。
分享到:
相关推荐
《深入理解Java虚拟机》是一本深度探讨...通过学习JVM性能调优,我们可以优化应用程序的资源利用,提高运行效率;理解内存模型有助于编写线程安全的代码;而掌握虚拟机原理则让我们能够更好地驾驭这个复杂的运行环境。
《JVM、GC详解及调优》是一份深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的详细资料。本文将根据提供的信息,深入阐述JVM的工作原理,GC的机制以及如何进行JVM的性能调优。 首先,JVM是...
3. 不稳定参数(不稳定参数):以“-XX”开头,这些是非标准化参数,主要用于JVM调优和Debug。它们可以开启或关闭某些特性,或者对某些特性设置具体的数值。例如,“-XX:+UseConcMarkSweepGC”用于启用CMS垃圾回收器...
通过对这本书的深入学习,Java开发者可以对JVM有更深入的理解,从而编写出更高效、更稳定的代码,并具备解决复杂性能问题的能力。对于团队负责人或系统架构师而言,理解JVM和GC调优也是必不可少的技能,有助于提升...
通过以上对JVM原理和参数调优的深入学习,开发者可以更好地理解Java应用程序的运行机制,优化系统性能,解决可能出现的内存溢出、性能瓶颈等问题。本课程详细讲解了这些内容,无论你是初学者还是经验丰富的开发者,...
《深入理解JVM性能调优和内存模型,垃圾回收,虚拟机原理,经典视频教程》是一套详尽的教育资源,旨在帮助Java开发者深入探索Java虚拟机(JVM)的内部工作机制,提升性能优化的能力。本教程共包含110讲,内容丰富,适合...
深入理解Java虚拟机详细视频教程,包括jvm性能调优、Java内存模型及虚拟机原理。有详细的文档资料,配合深入理解Java虚拟机书籍学习效果更佳
深入理解JVM的内核原理、诊断技巧以及优化方法对于提升应用性能至关重要。本教程——“深入JVM内核—原理、诊断与优化视频教程”,将重点讲解这些关键点,帮助开发者提升技术水平,更好地解决实际问题。 首先,我们...
本教程会讲解各种垃圾收集器(如Serial、Parallel、CMS、G1、ZGC、Shenandoah等)的工作原理和调优策略,以及如何分析内存泄漏和对象存活周期。 4. **性能监控与诊断工具**:JDK提供了一系列强大的工具,如JConsole...
本教程旨在帮助开发者深入了解JVM的工作原理及其内部机制,掌握JVM调优的方法和技术。通过学习本教程,开发者不仅能够提高自己的技术水平,还能更好地应对实际工作中遇到的问题。希望各位能够在学习过程中不断探索、...
7. **JVM内存模型**:理解JMM(Java内存模型)对并发编程极其重要,它规定了线程如何共享和访问内存,确保了多线程环境下的可见性、有序性和原子性。 以上知识是构建高性能、低延迟、可扩展的Java Web应用的基础,...
1. **内存管理**:JVM内存分为堆内存和栈内存,其中堆内存又分为新生代、老年代和永久代(Java 8后改为元空间)。合理的设置各区域大小,如新生代与老年代的比例,可以有效避免垃圾收集频繁触发,提高应用响应速度。...
这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage Collection, GC)的原理以及各种垃圾回收算法,这些都是JAVA程序员在日常工作中需要理解和掌握的核心技术。 首先,JVM内存模型是...
本文将围绕"JVM调优的实际应用"这一主题,深入探讨JVM的工作原理,讲解调优的重要性,并分享一些实用的调优工具和方法。 首先,了解JVM的工作原理是调优的基础。JVM主要分为以下几个区域:堆内存(Heap)、栈内存...
在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...
以上是对JVM源码解读和调优的全面解析,结合C/C++的视角,有助于开发者深入理解JVM的工作原理,提升Java应用程序的性能。在学习过程中,应结合具体项目实践,不断探索和优化,以达到最佳的运行效果。
### JVM虚拟机基础概念 ...通过深入学习JVM虚拟机的相关知识,不仅能够帮助开发者更好地理解Java程序的运行机制,还能够在实际开发过程中针对具体问题采取有效的优化措施,提升程序的运行效率和用户体验。
通过深入学习JVM,我们可以更好地设计和优化Java程序,提高系统性能,降低内存泄露和线程安全问题的风险。这本《JVM工作原理学习笔记》应包含了这些内容的详细讲解,对于学习和提升JVM相关知识极具价值。