文档章节

JVM概述

图样图森破
 图样图森破
发布于 2016/08/01 18:24
字数 1919
阅读 12
收藏 1
点赞 0
评论 0

1.1  JVM模式

Jvm分为client模式和server模式[在开发端使用什么模式有待商榷],两者的区别为:server模式启动速度慢(启动速度慢10%),运行之后效率高很多,client模式运行的代码可能会在server模式中出错。[此问题未找到明确的资料

Debugging tip: 

    For server applications, be sure to always specify the -server JVM command line switch when invoking the JVM, even for development and testing. The server JVM performs more optimization than the client JVM, such as hoisting variables out of a loop that are not modified in the loop; code that might appear to work in the development environment (client JVM) can break in the deployment environment (server JVM). For example, had we "forgotten" to declare the variable asleep as volatile in Listing 3.4, the server JVM could hoist the test out of the loop (turning it into an infinite loop), but the client JVM would not. An infinite loop that shows up in development is far less costly than one that only shows up in production.]

可以通过 java -version命令查看当前jvm的模式。

 

 

切换JVM的client和server模式:

修改jvm.cfg文件来进行调整JVM模式,

32位系统文件目录:JAVA_HOME/jre/lib/i386/jvm.cfg

64位系统文件目录:JAVA_HOME/jre/lib/amd64/jvm.cfg

 

切换方法:

“-server KNOWN”与”-client KNOWN”两个参数在前面的为JVM的当前模式,切换前必须保证JAVA_HOME/jre/bin目录下存在server和client两个文件夹。

 

1.2    JVM模型

JVM内存模型如下图:

 

1:程序计数器

当前线程所执行的字节码的行号指示器;

线程私有(每个线程分配一个);

字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分之、循环、跳转、异常处理、线程回复等基础功能都需要依赖它完成;

唯一不会出现OOM的区域。

2:虚拟机栈

线程私有,生命周期与线程相同

每个方法执行的时候都会生成一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等,当前方法执行完成之后,该方法对应的栈帧就会出栈,栈的执行顺序为先进后出。

3:本地方法栈

与虚拟机栈相似,运行本地方法,hotspot中将本地方法和虚拟机栈合二为一。

4:堆

线程共享;

几乎所有的对象实例及数组都需要在堆上分配,其中还有线程私有的分配缓冲区[],在物理内存中处于不连续的内存空间中。

5:方法区

线程共享;

存储已被JVM加载的类信息、常量、静态变量、即时编译器、编译后的代码等数据,HotSpot将该区与堆一起管理,成为持久代。

6:运行时常量池

此内存空间是方法区的一部分,存放编译器生成的各种字面量和符号引用,常量池将在类加载后进入方法区的运行时常量池中存放。

7:直接内存

直接内存不是JVM运行时数据区的一部分,也不是JVM规范中定义的内存区域,为了避免NIO在java堆和native堆中来回复制数据,才使用该内存空间。

 

1.3    JVM垃圾回收器

1:Serial收集器

单线程收集器,每次回收都会停止其他工作线程,client模式下新生代默认收集器,相比于其他单线程收集器相比效率很高。

新生代采用复制算法,老年代采用标记整理算法。

2:ParNew收集器

是Serial收集器的多线程版本,每次回收都会停止其他工作线程,只是GC线程为多个,server模式下新生代推荐使用的收集器,也是唯一一个可以和CMS收集器配合工作的收集器。

新生代采用复制算法,老年代采用标记整理算法。

3:Parallel Scavenge收集器

用于新生代,使用复制算法、并行[1并行:只多条垃圾收集线程并行工作,工作线程停在安全区域。

2并发:垃圾回收线程与工作线程同时进行,不会出现stop the world。]多线程的收集器。

此收集器关注点为吞吐量[吞吐量=程序运行时间/(程序运行时间+GC时间)]优先,并可以通过-XX:MaxGCPauseMillis参数控制最大垃圾收集停顿时间,通过-XX:GCTimeRatio参数控制吞吐量。还可以通过-XX:+UseAdaptiveSizePolicy参数让收集器自动控制新生代大小、Eden与Survivor区的比例、晋升老年代的对象年龄(自适应调节,这也是和ParNew收集器的重要区别)。

4:Serial Old收集器

是Serial收集器的老年代版本,单线程,使用标记整理整理算法,主要用于client模式下的JVM,当并发收集器发生Concurrent Mode Failure[]时备用该收集器。

5:Parallel Old收集器

Parallel Scavenge收集器的老年代版本。使用多线程和标记整理算法。

6:CMS收集器

这是一种获取最短回收停顿时间为目标的收集器,使用并发收集、标记清除算法。目前主流的收集器。

1.4 JVM回收算法

1: 标记清理算法:标记和清理两个过程效率都不高,并且会在内存中产生大量的碎片,以至于当大对象进入内存时无法进行分配足够的连续内存空间。

2:复制算法:由于年轻代垃圾回收率非常高(超过80%,甚至更高),将年轻带分为成一个较大的Eden空间和两个较小的Survivor空间,每次使用Eden和一个Survivor空间,当进行GC时,将这个区域中有用的对象复制到另外一个Survivor空间中,默认情况下Eden空间和Survivor空间的比例为8:1,当Survivor空间不足的时候会向老年代申请分配担保。

3:标记整理算法:将可回收对象标记并清理,清理完成之后,将存活的对象移动到内存的一端。

4:分代收集算法:将java堆分为年轻代与老年代,每个年代使用最合适的收集算法。由于年轻代大部分对象的生命周期非常短,所以使用复制算法;由于老年代对象存活率高、没有额外的担保空间,所以使用标记清理或者标记整理算法。

1.5 对象进入老年代

1:新生代对象每次进行一次GC,存活的对象年龄都会加1,当对象年轻到达指定值(HotSpot默认情况下为15)时会被转移到老年代。

2:如果年轻带中Survivor空间中相同年龄所有对象大小总和大于Survivor空间的一半,年龄大于等于该年龄的对象就可以直接进入老年代。

3:当进行MinorGC时,存活对象大于Servivor空间,则在老年代中进行担保。若老年代中空间不足则进行FullGC(majorGC)。

2.1 JVM参数

Xms : 初始堆大小

Xmx : 堆最大扩展大小

Xmn : 年轻代大小

-XX:PermSize : 持久代大小

-XX:MaxPermSize : 持久代扩展大小

Xss : 线程栈大小,默认1M

-XX:NewRatio : 年轻代与老年代的比值,Xms=Xmx且定义了Xmn的情况下不用设置

-XX:SurvivorRatio : Eden和Survivor大小比值,默认为8

-XX:+AggressiveOpts : 加快编译,jdk5 update6添加,1.6默认开启

-Xverify:none  禁止字节码验证过程

-server 使用server模式jvm

-client 使用client模式jvm

© 著作权归作者所有

共有 人打赏支持
图样图森破
粉丝 3
博文 28
码字总数 16198
作品 0
东城
程序员
JavaWeb07-HTML篇笔记(二)

1.1 案例一:使用JDBC完成CRUD的操作:1.1.1 需求: 对分类管理使用JDBC进行CRUD的操作. 1.1.2 分析:1.1.2.1 技术分析: 【JDBC的概述】 Ø JDBC:Java DataBase Connectivity Java数据库的连...

我是小谷粒 ⋅ 05/16 ⋅ 0

书单丨5本Java后端技术书指引你快速进阶

一名Java开发工程师 不仅要对Java语言及特性有深层次的理解 而且需要掌握与Java相关的 框架、生态及后端开发知识 本文涉及多种后端开发需要掌握的技能 对于帮助提高开发能力非常有帮助 NO.1...

Java高级架构 ⋅ 05/30 ⋅ 0

升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨 ⋅ 06/06 ⋅ 0

WildFly 13 "Baker's Dozen" 发布,改进 Java 10 兼容性

WildFly 13 Final 已正式发布,并提供了下载地址。下面不妨来看一下有哪些值得关注的更新。 EE8 功能和新的发布模型 这是使用新季度交付模式之后发布的第二个版本。该计划是在完全完成的增量...

局长 ⋅ 06/02 ⋅ 0

MyCAT SQL ON MongoDB

概述 可能你在看到这个标题会小小的吃惊,MyCAT 能使用 MongoDB 做数据节点。是的,没错,确实可以。 吼吼吼,让我们开启这段神奇的“旅途”。 本文主要分成四部分: 总体流程,让你有个整体...

wangchen1999 ⋅ 05/02 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 昨天 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 06/22 ⋅ 0

叮!您收到一份超值Java基础入门资料!

摘要:Java语言有什么特点?如何最大效率的学习?深浅拷贝到底有何区别?阿里巴巴高级开发工程师为大家带来Java系统解读,带你掌握Java技术要领,突破重点难点,入门面向对象编程,以详细示例...

聒小小噪 ⋅ 05/12 ⋅ 0

JVM汇总--jvm调优-命令篇

GC的最根本原因:垃圾收集器的工作就是清除Java创建的对象,垃圾收集器需要清理的对象数量以及要执行的GC数量均取决于已创建的对象数量。因此,为了使你的系统在GC上表现良好,首先需要减少创...

素雷 ⋅ 04/12 ⋅ 0

【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 06/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio 文档

https://istio.io/docs/concepts/ https://istio.io/docs/concepts/traffic-management/handling-failures/ https://istio.io/docs/concepts/traffic-management/rules-configuration/......

xiaomin0322 ⋅ 22分钟前 ⋅ 0

编程语言的作用及与操作系统和硬件的关系

一、编程语言的作用及与操作系统和硬件的关系 作用:编程语言是计算机语言,是一种程序员与计算机之间沟通的介质,通过编程语言可以使得计算机能够根据人的指令一步一步去工作,完成某种特定...

slagga ⋅ 33分钟前 ⋅ 0

runtime实现按钮点击事件

也不能说是实现吧,,,就是有点类似于RAC里边的写法,不用给btn添加另外的点击事件,就那个add...select...这样子很不友好,来看下代码: [self.btn handleControlEvent:UIControlEventTou...

RainOrz ⋅ 33分钟前 ⋅ 0

Windows系统运维转linux系统运维的经历

开篇之前,首先介绍一下我的背景把:我是一个三线城市的甲方运维。最近,在《Linux就该这么学》书籍的影响下和朋友小A(Linux运维已经三年了,工资也比我的高很多)的影响下,决定转行。最近...

linux-tao ⋅ 34分钟前 ⋅ 0

zip压缩工具,tar打包工具

zip压缩工具 zip打包工具跟前面说到的gzip,bz2,xz 工具最大的不一样是zip可以压缩目录。如果没有安装,需要使用yum install -y zip 来安装。安装完之后就可以直接使用了,跟之前提到的压缩...

李超小牛子 ⋅ 42分钟前 ⋅ 0

使用npm发布自己的npm组件包

一、注册npm账号 官网:https://www.npmjs.com/signup 注册之后需要进行邮箱验证,否则后面进行组件包发布时候会提示403错误,让进行邮箱核准。 二、本地新建一个文件夹,cd进入后使用npm i...

灰白发 ⋅ 44分钟前 ⋅ 0

010. 深入JVM学习—垃圾收集策略概览

1. 新生代可用GC策略 1. 串行GC(Serial Copying) 算法:复制(Copying)清理算法; 操作步骤: 扫描年轻代中所有存活的对象; 使用Minor GC进行垃圾回收,同时将存活对象保存到“S0”或“S...

影狼 ⋅ 44分钟前 ⋅ 0

JVM性能调优实践——JVM篇

在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践——性...

Java小铺 ⋅ 45分钟前 ⋅ 0

误关了gitlab sign-in 功能的恢复记录

本想关sign-up的,误点了sign-in 退出后登录界面提示: No authentication methods configured 一脸懵逼.. 百度后众多方案说修改application_settings 的 signin_enabled字段; 实际上新版本字段...

铂金蛋蛋 ⋅ 46分钟前 ⋅ 0

登录后,后续请求接口没有带登录cookie可能原因

1.XMLHttpRequest.withCredentials没设置好,参考https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/withCredentials...

LM_Mike ⋅ 46分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部