02、我们为什么要对jvm做优化:

1.标准参数:
-help
-version

2. -X参数(非标)

-Xint
-Xcomp

-Xint : interpreted
-Xcomp: complied  有卡顿,先编译,一次编译,之后不用编译,运行效率高
-Xmixed: mixed 默认

3.-XX参数(非标,使用率较高)

-XX:newSize
-XX:UseSerialGC

4.

-Xms
设置jvm堆内存初始大小
-Xms512m ==> -XX:InitialHeapSize=512m

-Xmx
设置jvm堆内存最大大小
-Xmx2048m ==> -XX:MaxHeapSize=2048m
eg.java -Xms64m -Xmx128m TestJVM

5.

jps -l

jinfo -flags 4086 查询该进程所有参数
eg. 
[root@node01 bin]# jinfo -flags 4086
Attaching to process ID 4086, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.141-b15
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=48234496 -XX:MaxHeapSize=752877568 -XX:MaxNewSize=250609664 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=15728640 -XX:OldSize=32505856 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
Command line: -Djava.util.logging.config.file=/export/servers/jvm/apache-tomcat-7.0.57/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/export/servers/jvm/apache-tomcat-7.0.57/endorsed -Dcatalina.base=/export/servers/jvm/apache-tomcat-7.0.57 -Dcatalina.home=/export/servers/jvm/apache-tomcat-7.0.57 -Djava.io.tmpdir=/export/servers/jvm/apache-tomcat-7.0.57/temp

jinfo -flag MaxHeapSize 4086 查询某个参数MaxHeapSize

04、JVM运行参数之-server与-client:

java -server -showversion TestJVM
初始堆空间大,并行垃圾回收器;
java -client -showversion TestJVM
初始堆空间小,串行垃圾回收器

06、JVM运行参数之-XX参数:

java -showversion -XX:+DisableExplicitGC TestJVM

java -showversion -XX:NewRatio=1 TestJVM

09、JVM内存模型之jdk1.7与jdk1.8内存模型(很重要):

jvm 1.7 年轻代 老年代 永久代

jvm 1.8 年轻代 老年代 取消了永久代,为了和JRocket VM融合。使用元空间metaspace代替老年代,元空间不在jvm中,而是在本地内存中。

10、JVM内存模型之jstat命令的使用:

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
eg.
[root@node01~]#jps
7080 Jps
6219 Bootstrap

1.class加载统计
[root@node01?~]# jstat ‐class 6219
Loaded??Bytes??Unloaded??Bytes?????Time???
??3273??7122.3????????0?????0.0???????3.98
2.编译统计
jstat -compiler 6219
3.垃圾回收统计
jstat -gc 4086 1000 5

11、jmap命令的使用:

jmap -heap 4086

jmap -histo 4086 | more

jmap -histo:live 4086 | more

将内存使用情况dump到文件中:
jmap -dump:format=b,file=/export/servers/jvm/dump.dat 4086

13、通过MAT工具对dump文件进行分析:

1.通过jhat对dump文件进行分析:
jhat -port 9999 /export/servers/jvm/dump.dat

OQL: 
eg.
select s from java.lang.String s where s.value.length >= 100

2.通过MAT工具对dump文件进行分析
下载mat,解压到本地物理机,然后执行MemoryAnalyzer.exe

shallow heap:对象本身占用内存大小,不包括它引用的对象 retained heap:当前对象大小+当前对象可直接或间接引用到的对象的大小总和.

14、内存溢出的定位与分析:

利用mat测试内存溢出时,必须生成一个文件java_pid12644.hprof用于分析测试,为此,需要在run/debug configuration中添加运行参数:
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

16、死锁问题:

jstack:
作用:查看jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等。
将正在运行的jvm的线程情况进行快照,并且打印出来。

jstack 4086 查看tomcat的所有线程状态

6种状态:
new runnable blocked waiting timed_waiting terminated

实战 死锁:
jstack 8569

Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007fd2bc0062c8 (object 0x00000000f115d790, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007fd2bc004e28 (object 0x00000000f115d7a0, a java.lang.Object),
which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
at TestDeadLock$Thread2.run(TestDeadLock.java:41)
- waiting to lock <0x00000000f115d790> (a java.lang.Object)
- locked <0x00000000f115d7a0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at TestDeadLock$Thread1.run(TestDeadLock.java:23)
- waiting to lock <0x00000000f115d7a0> (a java.lang.Object)
- locked <0x00000000f115d790> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

18、VirsualVM工具的使用(监控远程进程):

进入jdk安装目录/bin
打开jvisualvm.exe

远程监控的jvm:JMX
步骤:
1.在远程tomcat中添加参数;
JAVA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"

然后重启tomcat,并打印日志:
./startup.sh && tail -f ../logs/catalina.out

远程--添加远程主机,添加JMX连接。

JVM优化(上)的更多相关文章

  1. JVM史上最全实践优化没有之一

    JVM史上最全优化没有之一 1.jvm的运行参数 1.1 三种参数类型 1.1.1 -server与-clinet参数 2.1 -X参数 2.1.1 -Xint.-Xcomp.-Xmixed 3.1 ...

  2. JVM 平台上的各种语言的开发指南

    JVM 平台上的各种语言的开发指南 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目.尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的 ...

  3. JVM优化

    1.堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64 ...

  4. JVM 优化问题

    jvm 优化问题 JVM堆内存分为2块:Permanent Space 和 Heap Space. Permanent 即 持久代(Permanent Generation),主要存放的是Java类定 ...

  5. 性能优化系列三:JVM优化

    一.几个基本概念 GCRoots对象都有哪些 所有正在运行的线程的栈上的引用变量.所有的全局变量.所有ClassLoader... 1.System Class.2.JNI Local3.JNI Gl ...

  6. 系统优化怎么做-JVM优化之VisualVM

    大家好,这里是「聊聊系统优化 」,并在下列地址同步更新 博客园:http://www.cnblogs.com/changsong/ 知乎专栏:https://zhuanlan.zhihu.com/yo ...

  7. 多核服务器的JVM优化选项(转载)

    原文链接 现在多核CPU是主流.利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于Java程序,可以实现并发垃圾收集.但是Java利用多核技术也带来了一些问题,主要是多线程共享内存引起了.目前内存 ...

  8. JVM 优化之逃逸分析

    整理自 周志明<深入JVM> 1, 是JVM优化技术,它不是直接优化手段,而是为其它优化手段提供依据. 2,逃逸分析主要就是分析对象的动态作用域. 3,逃逸有两种:方法逃逸和线程逃逸.   ...

  9. java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置

    过去的几天里,我把JVM内部的垃圾回收算法和垃圾回收器.还剩下最后一个G1回收器没有说,我们今天数一下G1回收器和常见的参数配置. G1回收器 G1 (Garbage-First)是一款面向服务器的垃 ...

  10. JVM 线上故障排查基本操作--CPU飙高

    JVM 线上故障排查基本操作 CPU 飚高 线上 CPU 飚高问题大家应该都遇到过,那么如何定位问题呢? 思路:首先找到 CPU 飚高的那个 Java 进程,因为你的服务器会有多个 JVM 进程.然后 ...

随机推荐

  1. bzoj 1127 KUP —— 最大子矩形+答案构造

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127 首先,把权值 > 2*k 的点作为“坏点”,然后在图中用悬线法找权值最大的子矩形 ...

  2. combox组合框设置高度

    组合框设置高度 转载 2013年10月24日 22:54:03 1033 MFC进行界面编程时,组合框CComboBox控件在可视化设计组件的时候是无法进行高度编辑的,但是我们在实际的项目中经常需要定 ...

  3. .NET修改配置文件

    首先说明,本文参考了这个帖子http://www.cnblogs.com/henw/archive/2012/01/31/2333783.html,进行了一些补充 简要说来两种方法,一是把config ...

  4. P5089 [eJOI2018]元素周期表(并查集)

    传送门 以后看到棋盘要么黑白染色要么二分图! 我们考虑对行列建二分图,如果\(i\)行\(j\)列有,就把\(i\)和\(j+n\)连起来 我们要让它变成一张完全二分图.考虑条件\((i_1,j_1+ ...

  5. 《windows核心编程系列》一谈谈windows中的错误处理机制

    错误处理 我们写的函数会用返回值表示程序执行的正确与否,使用void,就意味着程序一定不会出错.Bool类型标识true时为真,false时为假.其他类型根据需要可以定义成不同意义. Windows除 ...

  6. [CQOI 2006]线段树之简单题

    Description 有一个n个元素的数组,每个元素初始均为0.有m条指令,要么让其中一段连续序列数字反转--0变1,1变0(操作1),要么询问某个元素的值(操作2).例如当n=20时,10条指令如 ...

  7. C#中实现C++中的友元类

    最近做一个小程序,一个类A(负责显示处理)需要大量调用类B(负责数据处理)的函数,我最先想到的C++中的友元概念,因为类B中的这些函数并不希望public,它只是允许类A调用监测. 网上搜索了一下,没 ...

  8. C# 基础知识和VS2010的小技巧总汇

    看了一些基础视频,才发现自己的基础比较薄弱,有很多基础知识都不知道.这里总汇一些基础知识. 1: foreach不仅可以作用于list类的索引集合,还可以遍历dictionary类,这一点比for更简 ...

  9. InputStream和OutputStream的一遍博客 分析非常到位

    http://www.cnblogs.com/springcsc/archive/2009/12/03/1616187.html

  10. vue-cli 3 配置打包环境

    从新建项目到设置打包环境 1.vue create vue-cli-env 2.新建 vue.config.js 文件,设置baseUrl: './' 3.新建各个环境的文件,例如:.env.deve ...