java虚拟机
文章平均质量分 74
源码了解:hadluo
这个作者很懒,什么都没留下…
展开
-
Eclipse开发go环境搭建
Windows平台下载完成后,直接双击安装即可默认情况下,.msi文件会安装在 C:\Go 目录下。可以将 C:\Go\bin 目录添加到环境变量 PATH 中,方便调用命令。Go 里面有两个非常重要的环境变量 GOROOT 和 GOPATH 。GOROOT 是 安装 go 的路径;GOPATH 是我们自定义的工作空间。GOPATH 可以是一个目录的列表,在 windows 环境变量中设置的时候,多个目录可以使用分号(;)分隔,在 Linux 环境变量中可以使用冒号(:)分隔。原创 2021-03-16 22:41:49 · 1859 阅读 · 0 评论 -
JVM - 组成结构
JVM 整体组成可分为以下四个部分:类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库接口(Native Interface)JVM组成如图所示:程序在执行之前先要把java代码转换成字节码(class文件),jvm首先需要把字节码通过一定的方式类加载器(ClassLoader)把文件加载到内存中运行时数据区(Runtime Data Area),而字节码文件是jvm的一套指令集规范,并不能直接交个原创 2021-03-08 22:12:00 · 129 阅读 · 0 评论 -
JVM - 类加载器(ClassLoader) 原理 详解
ClassLoader的作用就是将class文件加载到jvm虚拟机中去,JVM就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。JVM自带有三个类加载器Bootstrap ClassLoader最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。另外需要注意的是可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap C原创 2021-03-08 22:11:15 · 1518 阅读 · 0 评论 -
JVM - 运行时数据区 内存结构 详解
Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,只有在Java虚拟机退出时才会销毁。其他数据区域是每个线程。每个线程的数据区域在线程创建时创建,在线程退出时销毁。关于运行时数据区可以用以下图形来表示:下面我们一一来解析这几个区方法区方法区用于存储已被虚拟机加载的类信息、常量、静态变量、动态生成的类等元数据。是各个线程共享的内存区域。我们通过ClassLoader加载的Class对象是存放在堆区的,不是方法区。永久代(持久代)原创 2021-03-08 22:10:28 · 1317 阅读 · 1 评论 -
JVM - JDK8 堆+垃圾收集器 综合剖析
来张图大致感受下堆的结构:堆 与 栈JVM里的“堆”(heap)特指用于存放Java对象的内存区域(new创建的对象和数组),是用于管理动态生命周期的内存区域,堆的回收是由垃圾收集器来统一管理(不需要程序代码显示调用回收)。 堆被同一个JVM实例中的所有Java线程共享。栈用于存放指向堆对象地址的引用。程序访问堆是通过栈里的引用来访问的。如果堆的对象没有任何栈引用所指向,堆对象就有可能会被垃圾收集器回收掉。 栈引用的回收完全被JVM掌控,没有栈引用指向另一个栈引用的,方法执行开始就对应开辟一原创 2021-03-08 22:08:13 · 330 阅读 · 0 评论 -
JVM 详解之 CMS收集器
1.CMS触发GC的条件CMS GC 在实现上分成 foreground collector 和 background collector。foreground collector 相对比较简单,background collector 比较复杂,情况比较多。foreground collectorforeground collector 触发条件比较简单,一般是如下:老年代没有足够的连续空间分配给晋升的对象(即使总可用内存足够大)。新生代没有足够的空间分配对象。老年代没有足够的剩余空间来容纳原创 2020-07-24 10:42:44 · 2450 阅读 · 0 评论 -
jvm 局部变量表 详解
1.概念局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在 Java 程序编译为 Class 文件时,就在方法的 Code 属性的 max_locals 数据项中确定了该方法所需要分配的局部变量表的最大容量。2.实操验证请看下面一段代码public class TestStack { private Strin...原创 2020-04-23 11:42:15 · 2629 阅读 · 3 评论 -
JVM 面试 详解
1.ClassLoader相关1. 什么是类加载器?读取 Java 字节代码,并转换成java.lang.Class类的一个实例。2. 类相同的判断?被相同的类加载加载的类才是相同的类,这里指的“相同”,包括类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法、instanceof关键字等判断出来的结果。3. 类加载器种类?...原创 2020-02-02 15:09:22 · 574 阅读 · 0 评论 -
自定义ClassLoader 解决不同版本jar共存
1.有这样一个变态需求,有两个不同版本的dubbo.jar包,我们需要在项目中动态指定要运行哪个版本,改如何做?不同版本jar包准备package classloader;public class Dubbo { public void invoke() { System.err.println("我是Dubbo的V1版本"); }}将上面代码export成dubbo-v1...原创 2020-02-01 12:53:35 · 2666 阅读 · 2 评论 -
java运行时 动态修改class 动态增加方法耗时统计
1.有一个需求,我们的业务java服务正在运行,有一天我们定位到系统中某方法可能出现异常,我们要在不修改代码重新发版的情况下,统计出此方法的耗时和请求参数和返回值,怎么办?业务服务代码:public class OrderService { public static void main(String[] args) throws InterruptedException { for (...原创 2020-01-31 14:45:42 · 1979 阅读 · 0 评论 -
java指令重排实例
1.本文通俗易懂,直接看一个代码例子:public class 指令重排序 { static int x = 0, y = 0; static int a = 0, b = 0; public static void main(String[] args) throws InterruptedException { while (true) { ...原创 2019-10-11 15:47:03 · 1832 阅读 · 2 评论 -
java Class被加载的时机
简单概括:当主动使用此类时,就会被加载,分为以下6种情况: 1.创建类的实例 2.访问某个类或者接口的静态变量,或者对该静态变量赋值 3.调用类的静态方法 4.反射(Class.forName()) 5.初始化类的子类 6.java虚拟机启动时的main方法所在类下面用代码来举例: 首先要明白的是,类被加载判断:类中的静态代码块会原创 2016-12-29 10:29:53 · 2661 阅读 · 2 评论 -
垃圾收集器与内存分配策略
1.对象已死的判断 1.1引用计数算法 给对象添加一个计数器,每有一个地方引用它时,计数器加1,当引用失效时,计数器减1,计数器为0的对象是已死对象。java没有选择这种计数算法,因为存在对象相互循环引用问题。看下面例子:// 对象相互引用情景class A{ A instance ;}public static void main(String[...原创 2016-12-30 18:34:32 · 2513 阅读 · 0 评论 -
java内存详解
1.java运行时数据区图 2.程序计数器 线程私有内存。是当前线程所执行的字节码的行号指示器。简单来说:在一个确定时刻,处理器只会执行一条线程中的指令,为了线程切换后能恢复到正确的执行位置,每条线程就会需要独立的程序计数器来存储执行位置等。 如果线程正在执行一个java方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,则计数器为空。3.java虚...翻译 2016-12-30 17:22:23 · 4670 阅读 · 0 评论 -
JVM常见内存设置参数
1.-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError-Xms:最小堆设置 -Xmx:最大堆设置 将最小堆与最大堆设置为一样避免了虚拟机自动扩展堆大小 -XX:+HeapDumpOnOutOfMemoryError: 出现内存溢出时Dump当前的内存堆2.-Xss128k -Xss: 设置栈大小3.-XX:PermSize=10m -XX...原创 2018-02-27 16:05:30 · 375 阅读 · 0 评论 -
jps详解
jps是jdk提供的一个查看当前java进程的小工具。查找当前用户的Java进程,而不是当前系统中的所有进程。命令格式:jps [options ] [ hostid ] 参数如下jps -l 输出主类或jar的完全路径[root@S10 core]# jps -l29202 com.alibaba.dubbo.container.Main29981 sun.tools.jps.Jps2原创 2018-03-05 10:07:46 · 622 阅读 · 0 评论 -
jstat详解
Jstat是JDK自带的一个轻量级小工具。jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。参数详解jstat -class pid 显示加载class的数量,及所占空间。[root@S10 activity-assembly]# jstat -class 29202Loaded Bytes Unloaded Bytes Time原创 2018-03-05 11:35:24 · 575 阅读 · 0 评论 -
jmap详解
jmap一般使用于以下的几种情况:内存泄漏,线上程序在运行一段时间之后内存越来越大,这是我们要使用jmap命令dump出,内存的对象信息,然后进行分析 内存使用大于预期,这个一般是程序设计不合理,有很多冗余的对象放置在内存中,可以使用jmap查看内存中的对象,看看有些对象是否必要 jvm调优,可以使用jmap查看整个堆的使用情况。根据新生代,老年代的大小和使用比利,来对各个区域进行设置。参数j翻译 2018-03-06 14:38:03 · 6743 阅读 · 0 评论 -
java反编译教程
1.反编译是java开发者必不可少的东西,今天我们jd-gui-0.3.6.exe这个工具来反编译class文件。下面是下载地址: http://localhost2.工具使用起来很简单,双击打开–>File—>OpenFile选择你要反编译的class。下面我们来看下几个反编译后的神奇例子://------------- 实例1 ------------//反编译前public cl原创 2017-01-04 11:24:06 · 3093 阅读 · 0 评论