jvm

浅析JVM中的GC日志

自作多情 提交于 2020-02-12 23:20:02
目录   一、GC日志的格式分析   二、运行时开启GC日志 一、GC日志的格式分析 在讲述GC日志之前,我们先来运行下面这段代码 1 package com.example; 2 3 public class TestMinorGC { 4 private static final int _1MB = 1024*1024; 5 6 public static void testAllocation() { 7 byte[] allocation1, allocation2, allocation3, allocation4; 8 9 allocation1 = new byte[2 * _1MB]; 10 allocation2 = new byte[2 * _1MB]; 11 allocation3 = new byte[2 * _1MB]; 12 allocation4 = new byte[4 * _1MB]; 13 } 14 15 public static void main() { 16 testAllocation(); 17 } 18 } 配置如下的虚拟机参数运行上述程序: 1 vm option: -Xms20M -Xmx20M -Xmn10M -verbose:gc -XX:+PrintGCDetails -XX:SurvivorRatio=8 注: -XX

JVM跨平台原理、JRE跟JDK的介绍

大城市里の小女人 提交于 2020-02-12 17:46:42
   众所周知,java是一门可移植性很强的编程语言,而JVM、JRE跟JDK就起到了跨平台的作用 。 JVM:也可叫java虚拟机,每个平台对应的JVM都是不一样的,但他们唯一的目的就是可以执行相同的java文件 。 ps:(JVM(各系统版本不一)在平台或系统上安装使用 ------> java文件在JVM上编译执行 ) JRE:是java的运行环境,JRE包括了JVM跟核心类库,保证了一个java程序能在电脑上执行 ps:(JDE只含有JVM是不能运行java文件,还需要一些运行的核心类库 ) JDK:java开发工具包,JDK包含了JRE跟开发所需要的开发工具,开发只需要安装一个JDK就足够了 来源: https://www.cnblogs.com/Cccc4/p/12299563.html

JVM虚拟机 与 GC 垃圾回收

懵懂的女人 提交于 2020-02-12 16:31:24
一、JVM体系结构概述 1、JVM 与系统、硬件 ​ JVM 是运行在操作系统之上的,它与硬件没有直接的交互 2、JVM 体系结构概览 ​ 3、类装载器ClassLoader 执行原理 负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 ​ 4、类装载器ClassLoader装载流程(双亲委派) ​ 虚拟机自带的加载器 启动类加载器(Bootstrap)C++ 扩展类加载器(Extension)Java 应用程序类加载器(AppClassLoader)Java 也叫系统类加载器,加载当前应用的classpath的所有类 用户自定义加载器 Java.lang.ClassLoader的子类,用户可以定制类的加载方式 注 : Execution Engine执行引擎负责解释命令,提交操作系统执行。 ​ 5、Native Interface本地接口 本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++程序,Java 诞生的时候是 C/C++横行的时候,要想立足,必须有调用 C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体做法是 Native Method Stack中登记 native方法

java面试题

三世轮回 提交于 2020-02-12 15:22:15
1.为什么 wait,notify 和 notifyAll 是在 Object 类中定义的而不是在 Thread 类中定义: 1) wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。 2) 每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。 3) 在 Java 中为了进入代码的临界区,线程需要锁定并等待锁定 4) Java 是基于 Hoare 的监视器的思想。 2.为什么Java不支持多重继承, 可以考虑以下两点: 1)第一个原因是围绕钻石形继承问题产生的歧义 2)多重继承确实使设计复杂化并在转换、构造函数链接等过程中产生问题。 3.为什么Java不支持运算符重载? 1)简单性和清晰性。 清晰性是Java设计者的目标之一。设计者不是只想复制语言,而是希望拥有一种清晰,真正面向对象的语言。添加运算符重载比没有它肯定会使设计更复杂,并且它可能导致更复杂的编译器, 或减慢 JVM,因为它需要做额外的工作来识别运算符的实际含义,并减少优化的机会, 以保证 Java 中运算符的行为。 2)避免编程错误。 Java 不允许用户定义的运算符重载,因为如果允许程序员进行运算符重载,将为同一运算符赋予多种含义,这将使任何开发人员的学习曲线变得陡峭,事情变得更加混乱。据观察

关于JVM案例分析(三)

爷,独闯天下 提交于 2020-02-12 14:51:30
CPU分析篇 CPU 性能分析的主要目的是统计函数的调用情况及执行时间,或者更简单的情况就是统计应用程序的 CPU 使用情况。 没有程序运行时的 CPU 使用情况如下图: 运行一段 占用CPU 的小程序,代码如下 package jvisualVM; public class MemoryCpuTest { public static void main(String[] args) throws InterruptedException { cpuFix(); } /** * cpu 运行固定百分比 * * @throws InterruptedException */ public static void cpuFix() throws InterruptedException { // 80%的占有率 int busyTime = 8; // 20%的占有率 int idelTime = 2; // 开始时间 long startTime = 0; while (true) { // 开始时间 startTime = System.currentTimeMillis(); /* * 运行时间 */ while (System.currentTimeMillis() - startTime < busyTime) { ; } // 休息时间 Thread.sleep

关于JVM案例分析(四)

感情迁移 提交于 2020-02-12 14:50:01
线程分析篇 Java 语言能够很好的实现多线程应用程序。当对一个多线程应用程序进行调试或者开发后期做性能调优的时候,往往需要了解当前程序中所有线程的运行状态,是否有死锁、热锁等情况的发生,从而分析系统可能存在的问题。 在 VisualVM 的监视标签内,可以查看当前应用程序中所有活动线程(Live threads)和守护线程(Daemon threads)的数量等实时信息。 运行一段小程序,代码如下: package jvisualVM; public class MyThread extends Thread{ public static void main(String[] args) { MyThread mt1 = new MyThread("Thread a"); MyThread mt2 = new MyThread("Thread b"); mt1.setName("My-Thread-1 "); mt2.setName("My-Thread-2 "); mt1.start(); mt2.start(); } public MyThread(String name) { } public void run() { while (true) { } } } Live threads 从11增加两个 变成13了 Daemon threads从8增加两个 变成10了

关于JVM案例分析(二)

倾然丶 夕夏残阳落幕 提交于 2020-02-12 14:45:47
内存分析篇 VisualVM 通过检测 JVM 中加载的类和对象信息等帮助我们分析内存使用情况,我们可以通过 VisualVM 的监视标签对应用程序进行内存分析。 一.内存堆Heap 首先我们来看内存堆Heap使用情况,我本机eclipse的进程在visualVM显示如下: 随便写个小程序占用内存大的,运行一下 程序如下: package jvisualVM; public class JavaHeapTest { public final static int OUTOFMEMORY = 200000000; private String oom; private int length; StringBuffer tempOOM = new StringBuffer(); public JavaHeapTest(int leng) { this.length = leng; int i = 0; while (i < leng) { i++; try { tempOOM.append("a"); } catch (OutOfMemoryError e) { e.printStackTrace(); break; } } this.oom = tempOOM.toString(); } public String getOom() { return oom; } public

为什么Java的main方法必须是public static void?

我只是一个虾纸丫 提交于 2020-02-12 11:52:46
Main 方法是我们学习 Java 编程语言时知道的第一个方法,你是否曾经想过为什么 main 方法是 public、static、void 的。当然,很多人首先学的是 C 和 C++,但是在 Java 中 main 方法与前者有些细微的不同,它不会返回任何值,为什么 main 方式是 public、static、void,这篇文章尝试去找到一些答案。 Main 方法是 Java 程序的入口,记住,我们这里不会讨论 Servlet、MIDlet 和其他任何容器管理的 java 程序,在 java 核心编程中,JVM 会查找类中的 public static void main(String[]args),如果找不到该方法就抛出错误 NoSuchMethodError:main 程序终止。 Main 方法必须严格遵循它的语法规则,方法签名必须是 public static void,参数是字符串数组类型,如果是 Java1.5 及以后的版本还可以使用可变参数: public static void main(String... args) 为什么 main 方法是静态的(static)? 1、正因为 main 方法是静态的,JVM 调用这个方法就不需要创建任何包含这个 main 方法的实例。 2、因为 C 和 C++ 同样有类似的 main 方法作为程序执行的入口。 3、如果

JVM之---Java源码编译机制

空扰寡人 提交于 2020-02-12 08:45:46
Sun JDK中采用javac将Java源码编译为class文件,这个过程包含三个步骤: 1.分析和输入到符号表(Parse and Enter) Parse过程所做的工作有词法和语法分析。词法分析要完成将代码字符串转变为Token序列。语法分析则是根据语法将Token序列生成抽象语法树。 Enter过程将符号输入到符号表,通常包括确定类的超类型和接口、根据需要添加默认构造器、将类中出现的符号输入类自身的符号表中等。 2.注解处理(Annotation Processing) 该步骤主要用于处理用户自定义的annotation,可能带来的好处是基于annotation来生成附加的代码或进行一些特殊的检查,从而节省一些共同的代码的编写。此功能基于JSR269,在Sun JDK6 中提供了支持,在注解处理完之后,再次进入上一步骤。 3.语义分析和生成class文件(Analyse and Generate) 该步骤基于抽象语法树进行一系列的语义分析,包括将语法树中的名字、表达式等元素与变量、方法、类型等联系在一起;检查变量使用前是否已声明;推导泛型方法的类型参数;检查类型匹配性;进行常量折叠;检查所有语句都可到达;检查所有checked exception 都被捕获或抛出;检查变量的确定性赋值(例如有返回值的方法必须确定有返回值);检查变量的确定性不重复赋值

Tomcat中查看JVM内存使用情况

走远了吗. 提交于 2020-02-12 05:11:56
TOMCAT运行时,实时监控当前应用JVM的使用情况;可以利用Tomcat自带的应用manager查看详情。 首先,确认服务目录webapps下有manager应用 其次,需要创建 角色manager和对应的用户,修改/ conf/tomcat-users.xml [html] view plain copy <? xml version= '1.0' encoding= 'utf-8' ?> < tomcat-users > < role rolename= "tomcat" /> < role rolename= "role1" /> < role rolename= "manager-gui" /> < user username= "admin" password= "admin" roles= "manager-gui" /> < user username= "tomcat" password= "tomcat" roles= "tomcat" /> < user username= "both" password= "tomcat" roles= "tomcat,role1" /> < user username= "role1" password= "tomcat" roles= "role1" /> </ tomcat-users > 然后,浏览器输入网址