jvm

JVM探秘:VisualVM监控远程Java进程

喜欢而已 提交于 2020-02-13 20:42:46
VisualVM在Java 8中是JDK自带的一个图形化工具,项目主页 VisualVM ,在后续版本中可能会从JDK移除。 VisualVM可以监控Java进程的CPU与内存占用情况,可以监控Java进程内的各个线程的执行情况,还可以与MAT工具一样用来分析堆转储快照。 监控远程Tomcat进程 监控远程主机上的Tomcat进程,需要在Tomcat的catalina.sh文件中加入参数: JAVA_OPTS="$JAVA_OPTS -Dcom.sum.management.jmxremote -Dcom.sun.management.jmxremote.port=9004 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPV4Stack=true -Djava.rmi.server.hostname=x.x.x.x" -Dcom.sum.management.jmxremote: 启用JMX远程连接 -Dcom.sun.management.jmxremote.port=9004: 设置JMX连接端口 -Dcom.sun.management.jmxremote.authenticate: 是否开启用户名密码认证

JVM中常用参数

会有一股神秘感。 提交于 2020-02-13 17:50:39
常用参数的含义 参数 含义 说明 -XX:ClCompilerCount=3 最大并行编辑数 如果设置大于1,虽然编译速度会提高,但是同样影响系统的稳定性,会增加JVM崩溃的可能 -XX:InitialHeapSize=100M 初始化堆的大小 简写-Xms100M -XX:MaxHeapSize=100M 最大堆大小 简写-Xmx100M -XX:NewSize=20M 设置年轻代的大小 -XX:MaxNewSize=50M 年轻代最大大小 -XX:OldSize=50M 设置老年代大小 -XX:MetaspaceSize=50M 设置方法区大小 -XX:+UseParallelGC 使用UseParallelGC 新生代,吞吐量优先 -XX:+UseParallelOldGC 使用UseParallelOldGC 老年代,吞吐量优先 -XX:+UseConcMarkSweepGC 使用CMS 老年代,停顿时间优先 -XX:+UseG1GC 使用G1GC 新生代,老年代,停顿时间优先 -XX:NewRation 新老生代的比值 比如:-XX:Ratio=4,则表示新生代:老年代=1:4,也就是新生代占整个堆内存的1/5 -XX:SurvivorRatio 两个S区和Eden区的比值 比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8

JVM学习(六):Java内存模型

假装没事ソ 提交于 2020-02-13 17:19:04
1、 Java内存模型 (Java Memory Model,JMM): 线程 、 主内存 和 工作内存 。所有的变量都存储在主内存(虚拟机内存的一部分)中,每条 线程 还有自己的 工作内存 。线程对变量的所有操作(读取、赋值等)必须在工作内存中进行,不同线程之间无法直接访问对方工作内存中的变量,需要通过主内存来完成。 2、如果要把一个变量从 主内存复制到工作内存 ,就要顺序地执行 read 和 load 操作,如果要把变量从 工作内存同步回主内存 ,就要顺序地执行 store 和 write 操作。 3、由于 volatile 变量只能保证可见性,不能保证原子性,为了保证线程并发的安全性,使用volatile时必须满足以下运算场景: (1)运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。 (2)变量不需要与其他的状态变量共同参与不变约束。 4、Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性来建立的: (1) 原子性 (Atomicity):基本数据类型的访问读写是具备原子性的(64位的long和double除外),如果需要更大范围的原子性保证,需要 lock 和 unlock 来操作,对应字节码指令 monitorenter 和 monitorexit ,对应Java代码中就是 sychronized 关键字。 (2) 可见性

JVM垃圾回收算法

馋奶兔 提交于 2020-02-13 10:42:43
垃圾回收算法有:标记清除算法,复制算法,标记整理算法,分代收集算法。 1. 标记-清除算法 :先利用可达性分析算法,标记出存活的对象。标记完之后,再扫描整个空间中未被标记的对象进行回收。 缺点:效率低,会造成大量碎片。 2. 复制算法 :复制算法将空间分为两部分,每次使用其中的一部分。当一块内存用完了,就将这一块所有存活对象复制到另一块,将已使用的块清除。解决了碎片化问题,但会浪费一定的内存空间。 适用于对象存活率低的场景 (年轻代),因为年轻代多为生命周期较短的对象。年轻代将内存分为一个Eden, 两个Suvivor, 一个from区和一个to区。首先使用Eden, 当Eden内存占满时将存活对象复制到from,同时清空Eden。当from内存也满时,就复制Eden和from的存活对象到to,然后清空Eden和from。然后互换from和to的角色,保持to为空。当to放不下from和Eden的存活对象时,则需要老年代的空间担保。 3. 标记-整理算法 :在标记-清除算法的基础上,让所有存活的对象向左移动,并更新对应的指针。避免了内存的不连续行,不用设置两块内存互换, 适用于对象存活率高的场景 ,比如老年代。 4. 分代收集算法 :根据新生代,老年代的特点采用不同的算法。 新生代 对象的存活周期较短,所以 采用复制算法 。 老年代 对象存活周期较长,所以 采用标记-整理算法 。

JVM探秘:内存溢出

人盡茶涼 提交于 2020-02-13 10:30:25
在 Java 虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生OutOfMemoryError,这次通过一些代码来验证虚拟机各个内存区域存储的内容。 在实际工作中遇到内存溢出异常时,需要做到能根据异常信息快速判断是哪个内存区域的溢出,知道什么样的代码会导致这些区域内存溢出,并且知道出现内存溢出后如何处理。 Java堆溢出# Java 堆用于存储对象实例,只要不断的扩展对象,并且保证 GC Roots 到对象有可达路径来避免垃圾回收,那么对象数量到达堆的最大容量后就会发生内存溢出异常。 模拟堆内存溢出# 以下代码会把堆大小限制在20M且不可扩展(将最小参数-Xms和最大参数-Xmx设为相同就会避免自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在发生内存溢出时Dump出内存快照用来分析。 参数 说明 -XX:+HeapDumpOnOutOfMemoryError 内存溢出时自动导出内存快照 -XX:HeapDumpPath=E:/dumps/ 导出内存快照时保存的路径 Copy /** * Java堆内存溢出异常 * VM args: -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError * -Xms和-Xmx设为相同值避免堆内存自动扩展, * -XX:

(2) JVM内存管理:垃圾回收

我的未来我决定 提交于 2020-02-13 09:27:21
回顾上期 1)JVM中引用存在哪里? 答:虚拟机栈,该内存空间线程独有 2)该引用的对象存在哪里? 答:堆,所有通过new方法分配的对象都存在堆中 3)String s1="abc",字符串"abc"存在哪里? 答:运行时常量池,且常量池每次存储对象时会查找是否存过相等的对象,如果有,直接引用指向它,不再开辟空间。 如果你三个问题都可以回答出来,恭喜你!上一篇的精髓你get到了~~~~ 引用的分类 1) 强引用,默认分配方式均为此类型 Object a=new Object(); 2) 软引用,以强引用为参数,构造弱引用 Object a=new Object(); SoftReference<Object> b=new SoftReference<Object>(a); a=null; //强引用a一定要断掉 System.out.println(b.get()); //通过get()方法返回对象 3) 弱引用 Object a=new Object(); WeakReference<Object> b=new WeakReference<Object>(a); a=null; //强引用a一定要断掉 System.out.println(b.get()); //通过get()方法返回对象 System.gc(); 4)幽灵引用,和没有引用是一样的 引用的特点 1

【JVM】调优笔记3-----JVM参数配置 JDK1.8

核能气质少年 提交于 2020-02-13 04:58:33
一.关于JVM参数配置,有多种途径 。 1.在tomcat中直接配置的   打开tomcat的安装目录, 在bin下修改catalina.bat文件 添加如下: set "JAVA_OPTS=-Xmx300m -Xms300m -Xmn100m -XX:SurvivorRatio=8" 在这个位置: 启动tomcat即可起作用。 2.使用Myecplise,配置JVM参数 双击Tomcat,打开在如下位置,配置: -Xmx300m -Xms300m -Xmn100m -XX:SurvivorRatio=8 在如下位置即可。 然后启动项目,即可起作用。 二.标准配置 : -Xmx300m -Xms300m -Xmn100m -XX:SurvivorRatio=8 -XX:+UseG1GC -XX:MaxTenuringThreshold=14 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8-XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+TraceClassLoading -XX:

Tomcat PermGen space的解决方案

倾然丶 夕夏残阳落幕 提交于 2020-02-13 03:53:25
Tomcat报告 Caused by: java.lang.OutOfMemoryError: PermGen space异常 内存溢出PermGen space的全称是Permanent Generation space, 是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的, Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理, 所以如果你的应用中有很多CLASS的话,就很可能出现PermGenspace错误, 这种错误常见在web服务器对JSP进行pre compile的时候。 如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 堆内存分配:     -Xms  JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;     -Xmx  JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4;  默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。  因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 解决方法:

如何确定默认的Java堆大小?

…衆ロ難τιáo~ 提交于 2020-02-13 03:44:29
如果我从Java命令行中省略了 -Xmxn 选项,那么将使用默认值。 根据 Java文档 “根据系统配置在运行时选择默认值” 哪些系统配置设置会影响默认值? #1楼 Java 6更新18中 对此进行了更改。 假设我们拥有超过 1 GB 的物理内存(如今非常普遍),则它始终是您物理内存的1/4。 #2楼 埃内斯托是对的。 根据他发布的链接[1]: 更新了客户端JVM堆配置 在客户端JVM中... 默认的最大堆大小是物理内存的一半,最大物理内存大小为192 MB,否则为四分之一,最大物理内存大小为1 GB。 例如,如果您的计算机具有128兆字节的物理内存,则最大堆大小为64兆字节,并且大于或等于1千兆字节的物理内存将导致最大堆大小为256兆字节。 除非您的程序创建了足够多的对象来要求它,否则JVM实际上并没有使用最大堆大小。 在JVM初始化期间分配了一个较小的值,称为初始堆大小。 ... ... 服务器JVM堆配置的人机工程学与客户端相同,不同之处在于 32位JVM的默认最大堆大小为1 GB ,对应于4 GB的物理内存大小,而 64位JVM 的默认最大堆大小为32 GB ,对应于到128 GB的物理内存大小。 [1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html #3楼 在Windows上

JVM原理与内存模型

北城以北 提交于 2020-02-13 02:20:34
编译型语言:一次性地编译成机器码,生成可执行文件。 解释型语言:使用专门的解释器对源码逐行解释成特定平台的机器码并立即执行的语言。 JVM原理: Java语言既是编译型语言,又是解释型语言:Java源码通过javac命令被编译成.class文件,这种字节码文件不面向任何平台,只面向JVM(Java Virtual Machine);JVM是Java跨平台的关键部分,其向上提供给Java字节码程序的接口完全相同,而向下适应不同平台的接口则互不相同,为特定平台提供特定机器码,使用java命令解释执行。 JDK、JRE、JVM关系: JDK包括Java编译器,JRE和其它工具(如javaDoc、java调试器等);JRE包含JVM、类加载器、大量基础类库等。 内存模型: 1. 堆(Heap) 是Java虚拟机所管理的内存中最大的一块不连续的内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中),以及死亡的还未被回收的对象。其大小通过-Xms(初始值)和-Xmx(最大值)参数设置(都要小于1G),为了避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。堆内存 = 新生代+老生代(永久代不属于堆内存)。在我们垃圾回收的时候,我们往往将堆内存分成新生代和老生代(大小比例1:2),新生代中由Eden和Survivor0