`
lwcheng1985
  • 浏览: 93267 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm原理及部分配置

阅读更多


Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种Web应用。同时,为了提高Java语言的性能和健壮性,还引入了如垃圾回收机制等新功能,通过这些改进让Java具有其独特的工作原理。



1.Java虚拟机



Java虚拟机(Java Virtual Machine,JVM)是软件模拟的计算机,它可以在任何处理器上(无论是在计算机中还是在其他电子设备中)安全兼容地执行保存在.class文件中的字节码。Java虚拟机的“机器码”保存在.class文件中,有时也可以称之为字节码文件。



Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。因此在运行时,Java源程序需要通过编译器编译成为.class文件。



Java虚拟机的建立需要针对不同的软硬件平台来实现,既要考虑处理器的型号,也要考虑操作系统的种类。由此在SPARC结构、X86结构、MIPS和PPC等嵌入式处理芯片上,在UNIX、Linux、Windows和部分实时操作系统上都可实现Java虚拟机。



2.无用内存自动回收机制



在程序的执行过程中,部分内存在使用过后就处于废弃状态,如果不及时进行回收,很有可能会导致内存泄漏,进而引发系统崩溃。在C++语言中是由程序员进行内存回收的,程序员需要在编写程序时把不再使用的对象内存释放掉,这种人为管理内存释放的方法往往由于程序员的疏忽而致使内存无法回收,同时也增加了程序员的工作量。而在Java运行环境中,始终存在着一个系统级的线程,专门跟踪内存的使用情况,定期检测出不再使用的内存,并自动进行回收,避免了内存的泄露,也减轻了程序员的工作量。



3.代码安全性检查机制



安全和方便总是相对矛盾的。Java编程语言的出现使得客户端计算机可以方便地从网络上上传或下载Java程序到本地计算机上运行,但是如何保证该Java程序不携带病毒或者没有其他危险目的呢?为了确保Java程序执行的安全性,Java语言通过Applet程序来控制非法程序的安全性,也就是有了它才确保Java语言的生存。



Java字节码的执行需要经过以下3个步骤:



(1)由类装载器(class loader)负责把类文件(.class文件)加载到Java虚拟机中。在此过程需要检验该类文件是否符合类文件规范。



(2)字节码校验器(bytecode verifier)检查该类文件的代码中是否存在着某些非法操作,例如Applet程序中写本地计算机文件系统的操作。



(3)如果字节码校验器检验通过,由Java解释器负责把该类文件解释成为机器码进行执行。



注意:


Java虚拟机采用“沙箱”运行模式,即把Java程序的代码和数据都限制在一定内存空间里执行,不允许程序访问该内存空间以外的内存。如果是Applet程序,还不允许访问客户端机器的文件系统。
  



Java的运行环境



无论哪种语言都需要有它特定的运行环境,也就是平台。Java语言同样不例外。但是如何理解Java程序与硬件环境无关呢?



几乎所有的语言都需要通过编译或者解释才可以被计算机执行,但是Java有一点不同,它同时需要这两个过程。其实,也正是因为这个原因才使Java这种语言具有了平台无关性。当完成一个Java源程序后,首先,通过Java翻译程序将它编译成一种叫做字节码的中间代码,然后再由Java平台的解释器将它转换成为机器语言来执行,这一平台的核心就是JVM。



Java的编译过程与其他的语言不同。像C++这样的语言,在编译时它是与计算机的硬件平台信息密不可分的。编译程序通过查表将所有指令的操作数和操作码等转换成内存的偏移量,即程序运行时的内存分配方式,目的是保证程序正常运行。而Java却是将指令转换成为一种.class的文件,这种文件不包含硬件的信息,需要执行时只要经过安装有JVM的机器进行解释,创建内存分配后再通过查表来确定一条指令所在的地址。这样就有效地保证了Java的可移植性和安全性。



Java平台具有这样的特性和它的结构有关。通常一个程序运行的平台是一个硬件或者软件运行的环境,目前比较流行的是Windows XP、Linux、Solaris和MacOS。Java的平台不太一样,它由两个部分组成,即JVM和应用程序设计接口。



1.JVM



JVM是Java平台的核心,为了让编译产生的字节码能更好地解释与执行,因此把JVM分成了6个部分:JVM解释器、指令系统、寄存器、栈、存储区和碎片回收区。



◆JVM解释器:即这个虚拟机处理字段码的CPU。



◆JVM指令系统:该系统与计算机很相似,一条指令由操作码和操作数两部分组成。操作码为8位二进制数,主要是为了说明一条指令的功能,操作数可以根据需要而定,JVM有多达256种不同的操作指令。



◆寄存器:JVM有自己的虚拟寄存器,这样就可以快速地与JVM的解释器进行数据交换。为了功能的需要,JVM设置了4个常用的32位寄存器:pc(程序计数器)、optop(操作数栈顶指针)、frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)。



◆JVM栈:指令执行时数据和信息存储的场所和控制中心,它提供给JVM解释器运算所需要的信息。



◆存储区:JVM存储区用于存储编译过后的字节码等信息。



◆碎片回收区:JVM碎片回收是指将使用过的Java类的具体实例从内存进行回收,这就使得开发人员免去了自己编程控制内存的麻烦和危险。随着JVM的不断升级,其碎片回收的技术和算法也更加合理。JVM 1.4.1版后产生了一种叫分代收集技术,简单来说就是利用对象在程序中生存的时间划分成代,以此为标准进行碎片回收。



2.Java应用程序设计接口



Java Application Programming Interface简称Java API,其中文名为Java应用程序设计接口。它是一个软件集合,其中有许多开发时所需要的控件,可以用它来辅助开发。



Java API和JVM构成了Java运行的基本环境,这两种软件整合在一起处于计算机之上,通过这两种软件,Java平台把一个Java应用程序从硬件系统分离开,从而很好地保证了程序的独立性。为了更好地适应开发的需要,Java的设计者们提供了3种版本的Java平台:Java 2 Micro Edition (J2ME )、Java 2 Standard Edition(J2SE)和 Java 2 Enterprise Edition (J2EE),每一种版本都提供了丰富的开发工具以适应不同的开发需要。

1、Eclipse 使用tomcat调试的时候需要增大Jvm内存
-Dcatalina.base="E:\Workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0"
-Dcatalina.home="E:\Java\jakarta-tomcat-5.5.9"  -Djava.endorsed.dirs="E:\Java\jakarta-tomcat-5.5.9\common\endorsed" -Xms256m -Xmx512m
        JVM 配置可以参考:http://www.ja-sig.org/wiki/display/UPC/JVM+Configurations.
        以下部分参考:http://www.sdblog.cn/user1/6720/archives/2008/34039.html.

2、当程序部署之后,可能也会存在内存溢出的情况
        a. java.lang.OutOfMemoryError: Java heap space
        Heap size 设置
        JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。 提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。 提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值.
        解决方法:手动设置Heap size
        修改TOMCAT_HOME/bin/catalina.sh
        在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"  

        PermSize 设置
        b.java.lang.OutOfMemoryError: PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
        解决方法:手动设置MaxPermSize
        修改TOMCAT_HOME/bin/catalina.sh
        在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
        建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

3、在tomcat中redeploy时出现outofmemory的错误.  可以有以下几个方面的原因:
        1>.  使用了proxool,因为proxool内部包含了一个老版本的cglib.
        2>.  log4j,最好不用,只用common-logging。
        3>.  老版本的cglib,快点更新到最新版。
        4>.  更新到最新的hibernate3.2
摘自:
http://www.blogjava.net/zolly/archive/2009/03/13/JVM.html
http://captaincook.iteye.com/blog/402439
分享到:
评论

相关推荐

    Web服务器三剑客运维配置实战 Nginx+JVM+Tomcat+HTTP协议.zip

    虽然在课程中还讲解了部分HTTP协议的技术,但是课程的重点还是NGINX、JVM、Tomcat三相运维与配置技术。课程内容包括了Nginx进阶基础,Nginx配置提升,JVM虚拟机尝试,JVM运维实用排障工具,JVM监控工具,Tomcat配置...

    Web服务器三剑客运维配置实战 Nginx+JVM+Tomcat+HTTP协议 视频教程+笔记+课件+资料

    虽然在课程中还讲解了部分HTTP协议的技术,但是课程的重点还是NGINX、JVM、Tomcat三相运维与配置技术。课程内容包括了Nginx进阶基础,Nginx配置提升,JVM虚拟机尝试,JVM运维实用排障工具,JVM监控工具,Tomcat配置...

    微服务架构面试专题系列(MySQL,JVM,并发编程,RabbitMQ消息中间件,Spring)

    MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离 Mysql主从同步的实现原理 MySQL索引背后的数据结构及算法原理 摘要数据结构及算法基础 索引的本质 B-Tree和B+Tree B-Tree B+Tree 带有顺序...

    Java程序员大厂面试(进大厂必看)

    MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离 Mysql主从同步的实现原理 MySQL索引背后的数据结构及算法原理 摘要数据结构及算法基础 索引的本质 B-Tree和B+Tree B-Tree B+Tree 带有顺序...

    10G的Java面试题视频课

    MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离 Mysql主从同步的实现原理 MySQL索引背后的数据结构及算法原理 摘要数据结构及算法基础 索引的本质 B-Tree和B+Tree B-Tree B+Tree 带有顺序...

    互联网企业面试真题.zip

    MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离 Mysql主从同步的实现原理 MySQL索引背后的数据结构及算法原理 摘要数据结构及算法基础 索引的本质 B-Tree和B+Tree B-Tree B+Tree 带有顺序...

    2021最新java面试合集pdf.rar

    JVM面试专题及答案.pdf Linux系统Redis笔记.docx MongoDB学习笔记.docx mybatis原理.docx MyBatis面试专题.docx MyBatis面试专题及答案.pdf Mybatis面试题(含答案).pdf MySQL性能优化的21个最佳实践.pdf mysql面试...

    Tomcat7基于Redis的Session共享

    tomcat7-redis-cluster概要 1.原理: 原理就是继承tomcat的manager接口,接管session的持久化...必须手动的调用session的setAttribute方法,才能同步到你的存储里面,因为分布式session的应用可能不在同一个jvm上面

    Tomcat8基于Redis的Session共享

    tomcat8-redis-cluster概要 1.原理: 原理就是继承tomcat的manager接口,接管session的持久化...必须手动的调用session的setAttribute方法,才能同步到你的存储里面,因为分布式session的应用可能不在同一个jvm上面

    java是什么.avi

    了解 Java 语言的版本及特点 了解学习 Java 的方法 掌握 JDK 的安装 掌握环境变量的配置 熟悉 Java 程序的编写、编译和运行过程 了解 Java 虚拟机的作用 熟悉 Java 程序的各个组成部分 了解 Java 编程规范 掌握 ...

    Java虚拟机

    全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、...

    达内java培训目录

    Servlet/JSP Servlet生命周期及Servlet服务器、Tomcat部署配置、JSP语法、自定义标记、JSTL和EL表达式、JSP 新特性、Java Web 设计模式。 透彻理解Servlet核心原理;熟练掌握Servlet API;透彻理解JSP引擎工作原理;...

    java面试题库2021.pdf

    ⑤JVM ⑥GC ⑦ IO 和 NIO, AIO 二、 JavaEE 部分 1、 Spring ①IoC 与 Bean 配置、 管理 ②AOP 与事务、 权限控制 ③S2SH 整合开发 ④Spring, JPA 整合 2、 Hibernate ①ORM 与持久化映射 ②延迟加载、 性能优化 ...

    应用分析监控平台 闪电狗.zip

    视频教程 入门使用 项目起源、原理介绍、安装部署、应用接入 深入了解(计划中) 脚本模板介绍、日志监控、性能监控、在线人数监控、关键字监控、按天统计 开发与拓展(计划中) 项目结构、模块分解、maven...

    java面试题

    76.4. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 86 76.5. 在weblogic中发布ejb需涉及到哪些配置文件 87 76.6. 如何在weblogic中...

    Java编程经验

    不过至少笔者今日才弄懂JVM去查询类的原理,编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader. 这3个加载器分别对应着...

    Solr权威指南-下卷

    包括部署、配置、Solr Core、Solr DIH、全量导入、增量导入、索引、中文分词、查询组件、Solr Facet、高亮、查询建议,以及企业如何在真实的项目中使用Solr。不仅讲解了基本概念和使用方法,而且还分析了各组件的...

    Solr权威指南-上卷

    包括部署、配置、Solr Core、Solr DIH、全量导入、增量导入、索引、中文分词、查询组件、Solr Facet、高亮、查询建议,以及企业如何在真实的项目中使用Solr。不仅讲解了基本概念和使用方法,而且还分析了各组件的...

    Hadoop硬实战 [(美)霍姆斯著][电子工业出版社][2015.01]_PDF电子书下载 带书签目录 高清完整版.rar )

    第1 部分 背景和基本原理 1 跳跃中的Hadoop 1.1 什么是Hadoop 1.1.1 Hadoop 的核心组件 1.1.2 Hadoop 生态圈 1.1.3 物理架构 1.1.4 谁在使用Hadoop 1.1.5 Hadoop 的局限性 1.2 运行Hadoop ...

    千方百计笔试题大全

    27、描述一下JVM 加载class 文件的原理机制? 10 28、char 型变量中能不能存贮一个中文汉字?为什么? 10 29、abstract class 和interface 有什么区别? 10 30、Static Nested Class 和Inner Class 的不同? 11 31、java...

Global site tag (gtag.js) - Google Analytics