- 浏览: 482436 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
alvin198761:
renzhengzhi 写道我参与过12306余票查询系统的开 ...
别给12306 辩解了 -
renzhengzhi:
我参与过12306余票查询系统的开发,用户请求被前面3层缓存拦 ...
别给12306 辩解了 -
renzhengzhi:
写的很好。
JAVA线程dump的分析 -
liyonghui160com:
说好的附件呢
分布式服务框架 Zookeeper -- 管理分布式环境中的数据 -
ghpaas:
orbeon作为xforms标准的实现,不论其设计器还是运行时 ...
XForms 1.1 中文翻译—第1章 关于XForms标准
堆内存(heap)是由Java虚拟机控制管理的,因此,这些参数对JVM而言都有一个默认值,但在某些情况下这些参数的默认值并不是最优的,这就需要我们通过调整这些参数的值来提高JVM的性能,最终提高应用的性能指标。
在实际的应用开发中,如果应用所使用的系统内存较大,经常会引发内存溢出的错误:
…
java.lang.OutOfMemoryError <<no stack trace available>>
java.lang.OutOfMemoryError <<no stack trace available>>
Exception in thread "main"
…
这可能是因为应用要使用的堆内存(heap)超过了JVM所管理内存范围,如果我们适当追加内存值有时就可以避免这种致命错误的出现。
在WINDOWS系统上你可以通过参数-verbosegc查看JVM回收内存的信息,在HP UNIX系统上你可以通过-Xverbosegc:file=/tmp/gc$$.out参数将信息重定向到一个文件中。然后查看相应的信息,例如下面的这个类。
public class A {
public static void main(String args[]) {
for (int i =0 ;i < 100000;++i) {
A a = new A();
}
System.out.println("this is a GC test");
}
}
在类A的main方法中创建了100 000个A对象,然后我们看一下JVM回收内存的情况,编译并执行这个类:
>java -verbosegc A
[GC 512K->91K(1984K), 0.0027537 secs]
this is a GC test
从输出信息中可以看出总共有1984KB的内存被回收,耗时0.002 753 7秒。现在我们将类A添加一行清除对象引用的代码:
public class A {
public static void main(String args[]) {
for (int i =0 ;i < 100000;++i) {
A a = new A();
a = null;
}
System.out.println("this is a GC test");
}
}
编译并执行这个类:
>java -verbosegc A
[GC 512K->91K(1 984K), 0.0 027 450 secs]
this is a GC test
我们看到被回收内存的数量并没有变化,但是回收所需要的时间却变成了0.002 745 0秒,后者比前者节省了0.000 008 7秒,千万不要小看这0.000 008 7秒,当你的应用足够复杂时这个时间就会成指数级增长,看来我们主动清除对象引用的方法,确实可以加速JVM对垃圾内存的回收。
如果再在类A中加入一行强制系统内存回收的代码,结果又会怎样呢?如下所示:
public class A {
public static void main(String args[]) {
for (int i =0 ;i < 100000;++i) {
A a = new A();
a = null;
}
System.gc();
System.out.println("this is a GC test");
}
}
编译并执行这个类:
>java -verbosegc A
[GC 512K->91K(1984K), 0.0 027 272 secs]
[Full GC 487K->91K(1984K), 0.0 070 730 secs]
this is a GC test
系统这次做了两次内存回收,第一次是程序中强制系统内存回收的代码System.gc()导致的内存回收,而后者是系统最终的内存回收操作,我们看到强制内存回收耗时不长,可是却导致了系统最终垃圾回收的时间加长了很多,因此我们在采用强制系统垃圾回收(通过显式调用方法System.gc())的办法来回收系统垃圾内存的办法,还是存在一些弊端的,应尽量少用,或者说只在必要的时候应用。
上面我们提到的内存回收操作就是回收JVM所管理的堆内存(heap)。当系统连续申请内存并且超过JVM所管理的堆内存(heap)的最大值时,就会产生系统内存溢出的致命异常,下面我们来看一下怎样通过设置JVM的内存参数来优化JVM对内存的管理,避免内存溢出异常的发生。表2-1所示的就是与JVM内存相关的参数及其说明。
表2-1 与JVM内存相关的参数及其说明
根据表2-1中所描述的参数意义,我们可以在启动应用时为JVM设置相应的参数值以提高系统的性能,例如下面的例子:
java -XX:NewSize=128m -XX:MaxNewSize=128m -XX:SurvivorRatio=8 -Xms512m
-Xmx512m MyApplication
类文件(.class)的大小
由Java源文件.java文件编译成JVM 可解释执行的Java字节文件.class。因所采用的编译方式的不同而大小也不同。通常.class文件的大小也存在是否占用较大内存的问题。通过降低.class文件的大小,不但可以降低系统内存的开销,还可以节省网络开销,虽然这部分内容与JVM内存管理联系不大,但是我觉得还是有必要提一下,因为这在你开发Applet应用时会有帮助(注:在本书后续的章节中,将会对如何减小Java类尺寸的技术话题做更为深入的探讨)。因为一般来说,Applet应用都是靠网络分布式传输由客户端浏览器装载运行的,如果类文件较大,无疑将会增大网络开销,降低传输速度无法满足用户的需求,并且如果类文件较大,无疑也会消耗客户端内存资源。我们可以通过在Java编译器javac中添加相应的参数,来缩小类文件的大小,解决上面的问题。
通常有三种编译方式会影响类文件的大小。
(1)默认编译方式: javac A.java。
(2)调试编译方式: javac –g A.java。
(3)代码编译方式: javac –g:none A.java。
例如如下所示的简单的类A:
public class A {
public static void main(String args[]) {
for (int i =0 ;i < 100000;++i) {
A a = new A();
}
}
}
通过上面这三种方式编译后的类文件的大小分别为:
默认编译方式:291字节。
调试编译方式:422字节。
代码编译方式:207字节。
采用三种不同的方式,编译产生的类文件的大小差异非常大,这是什么原因导致的呢?原来在于.class文件中包含多个不同的部分或属性。
代码(Code)属性包含实际的方法字节码。源文件信息(SourceFile Information)包含用于生成.class的源文件名称。代码行序号表(LineNumberTable)用来映射源文件中的代码行序号与字节码文件中的序号偏移。本地变量表(LocalVariableTable)用来映射本地变量与栈桢的偏移。
&注意 如果你想了解字节码文件.class的文件结构详细信息,请参考相关的技术资料,这里就不详细讲解了。
正是由于上面这三种编译方式生成的类文件所包含的信息不同,才导致了类文件的大小差异较大,其包含的信息分别如下所示。
默认编译方式:代码(Code)、源文件信息(SourceFile Information)、代码行序号表(LineNumberTable)。
调试编译方式:代码(Code)、源文件信息(SourceFile Information)、代码行序号表(LineNumberTable)、本地变量表(LocalVariableTable)。
代码编译方式:代码(Code)。
这就是三种编译方式产生类文件大小不同的根本原因。而这三种编译方式在程序开发的不同阶段却都起着非常重要的作用,例如,调试编译方式在程序的调试开发过程中应采用,以获取更为详细的调试信息。因此具体应用上面的三种编译方式中的哪一种,应该适时而定。
发表评论
-
高性能、高流量Java Web站点打造的最佳实践
2013-12-24 11:23 2813从2005年-2013年,Ashwanth Fernando ... -
高性能、高流量Java Web站点打造的最佳实践
2013-12-24 11:01 4从2005年-2013年,Ashwanth ... -
20行实现javascript模板引擎
2013-12-23 10:35 150920行实现javascript模板引擎 我仍然在用Abs ... -
标题怎么办
2012-03-25 23:50 21.首先在这里 下载Selenium RC,解压到C盘。 ... -
Google Page Speed应用上线,移动设备也在支持之列
2011-04-05 21:23 855Google已经将Page Speed应用到线上,并且加强 ... -
浏览器的加载与页面性能优化
2011-02-16 11:23 1317本文将探讨浏览器渲染的loading过程,主要有2 ... -
门户网站负载均衡技术的六大新挑战
2010-12-23 11:25 995文 / 李晓栋 记得上 ... -
使用 JAWS 测试 Web 应用的技巧
2010-10-31 23:34 1633屏幕阅读器简介 屏幕阅读器(S ... -
How We Evaluate the Experiences We Engineer
2010-10-26 14:38 7169 and how we measured (and co ... -
研究显示:众多网上零售商未遵循Web优化基本准则
2010-10-26 10:25 697Web优化专家Joshua Bixby最近在博客中披露,在 ... -
Testing sites with Browser Mode vs. Doc Mode
2010-10-22 10:07 1066With site developers verifying ... -
Common Security Mistakes in Web Applications
2010-10-22 10:02 1694Web application developers toda ... -
A (somewhat) brief history of the performance landscape
2010-10-21 10:44 1713I’d like to enlist your help. ... -
Best Practices for Speeding Up Your Web Site
2010-10-20 10:40 1205Minimize HTTP Requests tag: ... -
Web Performance Optimization Use Cases – Part 1 Benchmarking
2010-10-19 14:40 940Web Performance Optimizatio ... -
Google WebP——让图片更小,让页面访问速度更快
2010-10-12 13:14 1587Google日前对外宣布了一种新的图片压缩格式WebP,可 ... -
剖析IE浏览器子系统的性能权重
2010-09-02 13:23 874最近,InfoQ中文站报道了Web 2.0应用客户端性能问 ... -
Performance: Profiling how different web sites use browser subsystems
2010-09-02 00:41 1206When we first showed IE9 at t ... -
Measuring Browser Performance: Understanding issues in benchmarking and performa
2010-09-02 00:40 946Measuring Browse ... -
Ajax应用开发:实践者指南
2010-08-10 21:13 977目前的Web应用开发基本上都是围绕富互联网应用(Rich ...
相关推荐
### JVM内存参数调优详解 #### 一、概述 Java虚拟机(JVM)是执行Java字节码的软件环境,为了提高Java程序的性能和稳定性,合理调整JVM的内存参数至关重要。根据Java启动参数的不同分类,我们可以将其分为标准参数...
JVM参数调优部分未在提供的内容中显示,但一般来说,JVM参数调优会涉及到调整堆内存分配、堆外内存大小、垃圾回收器选择、新生代和老年代的比例,以及各种相关参数如-Xms、-Xmx、-Xmn、-XX:+UseG1GC等。这些调整能...
【部分内容】提供了设置Tomcat JVM内存大小的三种方法: 1. 直接在启动脚本(如`catalina.bat`或`catalina.sh`)中添加`JAVA_OPTS`环境变量,设置`-Xms`和`-Xmx`。 2. 通过设置操作系统环境变量`JAVA_OPTS`来调整...
1. **JVM内存设置** - **堆内存**:Java对象主要存储在堆中,分为新生代(Young Generation)和老年代(Tenured Generation)。新生代又细分为Eden区和两个Survivor区。调整-Xms和-Xmx设置新生代和老年代的初始大小...
1. **内存配置**:JVM内存分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(PC Register)。通过-Xms和-Xmx设置初始和最大堆内存,-XX:NewRatio调整...
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
《JVM工具、参数调优及调试技巧》 在Java开发中,理解并掌握JVM(Java虚拟机)的工作原理,以及如何进行工具使用、参数调优和问题调试,是提升程序性能的关键步骤。本文将深入探讨这些核心知识点,帮助开发者优化...
Java虚拟机(JVM)参数调优和相关工具的使用对于优化Java应用程序的性能至关重要。JVM负责管理和分配内存,其中垃圾收集(GC)是其核心功能,它自动管理内存,确保活动对象保留在内存中,同时释放不再使用的对象以...
本篇文章将深入探讨JVM参数调优以及如何针对Tomcat进行优化。 首先,JVM调优主要包括堆内存分配、垃圾收集器选择、线程池配置、类加载机制调整等方面。堆内存是Java应用的主要内存区域,分为新生代、老年代和永久代...
JVM 内存参数详解以及配置调优 JVM 内存参数是 Java 虚拟机中最重要的参数之一,它直接影响着 Java 应用程序的性能和稳定性。在这个资源中,我们将详细讨论 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、...
JVM参数调优是优化Java应用程序性能的关键环节,尤其是在服务器端的应用中,如Web服务器Resin。本实践案例中,作者分别尝试了三种不同的垃圾回收(GC)策略:串行回收、并行回收和并发回收,并针对每种策略提供了...
### JVM_GC调优详解 #### 一、JVM体系结构概览 Java虚拟机(JVM)作为Java程序的运行环境,其内部结构复杂且高效。为了更好地理解JVM_GC调优,...同时,掌握JVM内存模型和垃圾回收器的工作原理也是进行有效调优的基础。
Java JVM(Java虚拟机)内存分配与调优是Java...通过理解JVM内存模型,选择合适的垃圾收集器和设置合理的内存参数,可以有效提升Java应用的性能和稳定性。在实践中,不断学习和试验,才能找到最适合应用的内存配置。
3. 不稳定参数(不稳定参数):以“-XX”开头,这些是非标准化参数,主要用于JVM调优和Debug。它们可以开启或关闭某些特性,或者对某些特性设置具体的数值。例如,“-XX:+UseConcMarkSweepGC”用于启用CMS垃圾回收器...
通过以上对JVM原理和参数调优的深入学习,开发者可以更好地理解Java应用程序的运行机制,优化系统性能,解决可能出现的内存溢出、性能瓶颈等问题。本课程详细讲解了这些内容,无论你是初学者还是经验丰富的开发者,...
- **内存配置**:`java_OPTS`中添加JVM内存参数,如`-Xms`和`-Xmx`,以调整Tomcat使用的内存大小。 - **日志优化**:关闭无用的日志输出,或者使用异步日志,减少I/O操作对性能的影响。 **2. JVM参数调优** JVM参数...
JVM参数调优主要涉及到堆内存、栈内存、元空间、垃圾收集器等设置。常用的JVM启动参数有: - `-Xms` 和 `-Xmx`:设置初始堆内存和最大堆内存大小,例如 `-Xms256m -Xmx1024m`。 - `-Xss`:设置每个线程的栈内存...
**JVM内存管理及调优** Java虚拟机(JVM)是Java程序运行的基础,它为Java应用程序提供了运行环境。JVM内存管理是优化Java应用性能的关键环节,涉及到内存分配、垃圾回收以及内存溢出等问题。毕玄,一位在淘宝有着...
JVM调优是指通过调整JVM的各种参数来优化应用程序的性能,主要包括以下方面: - **内存设置**:合理设置堆内存大小,避免频繁的垃圾回收。 - **垃圾回收器选择**:根据应用特性选择合适的垃圾回收器。 - **监控工具...