jvm

计算Java对象内存大小

这一生的挚爱 提交于 2020-03-21 07:05:18
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。最后推荐JDK自带的Hotspot Debug工具——HSDB,来查看对象在内存中的具体存在形式,以论证文中所述内容。 背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000。我们的业务系统中就使用了size为10000的15个本地缓存,所以最坏情况下将可缓存15万个对象。这会消耗掉不菲的本地堆内存,而至于实际上到底应该设多大容量的缓存、运行时这大量的本地缓存会给堆内存带来多少压力,实际占用多少内存大小,会不会有较高的缓存穿透风险,目前并不方便知悉。考虑到对缓存实际占用内存的大小能有个更直观和量化的参考,需要对运行时指定对象的内存占用进行评估和计算。 要计算Java对象占用内存的大小,首先需要了解Java对象在内存中的实际存储方式和存储格式。 另一方面,大家都了解Java对象的存储总得来说会占用JVM内存的堆内存、栈内存及方法区,但由于栈内存中存放的数据可以看做是运行时的临时数据,主要表现为本地变量、操作数、对象引用地址等。这些数据会在方法执行结束后立即回收掉

JVM

旧时模样 提交于 2020-03-20 11:07:57
Java虚拟机(JVM)是运行Java字节码的虚拟机 JVM可以理解的代码叫做字节码(.class文件) Java程序从源代码到运行一般分3步 : .java文件 -> .class文件 -> 机器可以执行的二进制机器码 字节码到机器码的过程中,JVM 类加载器首先加载字节码文件,然后通过解释器 逐行解释执行,这个方式的执行速度会比较慢,而且,有些方法和代码块是经常被调用,所有后面引进了JIT编译器,而JIT属于运行时编译。当JIT编译器完成第一次编译后,会将字节码对应的机器码保存下来,下次可以直接使用。所以说java是编译与解释共存的语言。 来源: https://www.cnblogs.com/holdoncomeon/p/12530015.html

Dynamically compile java code which has dependencies on classes loaded by specific classloader

泪湿孤枕 提交于 2020-03-20 06:36:47
问题 We have an ability to compile java code dynamically on the fly. I know at least Java-Runtime-Compiler and InMemoryJavaCompiler But seems they cannot compile class which depends on some class from certain classloader. Is it possible to dynamically compile java code which depends on classes available only in specific classloader? Let's say: ClassLoader classloader = ... // only this CL can load class 'com.External' String source = "public class MyClass extends com.External {}"; Class<?>

graphqlize 基于jvm的快速生成graphql api 的库

◇◆丶佛笑我妖孽 提交于 2020-03-19 10:44:31
graphqlize 是基于Clojure 开发的快速生成java graphql api 的库,支持pg 以及mysql 使用比较方便 graphqlize 基本玩法 添加依赖(library) 初始化resovler (配置sql 数据源) 添加graphql api endpoinnt 配置 当前支持的开发模式 java spring boot spark java 原生java Clojure Pedestal Ring 原生Clojure 支持的数据库 当前作者已经支持了pg以及mysql,同时对于oracle还有sql server 的也在规划中,这是一个比较好玩的库,相比 使用graphql-java 快速了好多 参考资料 https://github.com/graphqlize/graphqlize 来源: https://www.cnblogs.com/rongfengliang/p/12522023.html

Will `jcmd PID GC.class_histogram` call a full GC before collecting data?

六月ゝ 毕业季﹏ 提交于 2020-03-19 07:46:50
问题 When I run jcmd PID help GC.heap_dump , the help clearly says that full GC will be called, unless -all flag is specified: GC.heap_dump ... Impact: High: Depends on Java heap size and content. Request a full GC unless the '-all' option is specified. <...> -all : [optional] Inspect all objects, including unreachable objects (BOOLEAN, false) If I run jcmd PID help GC.class_histogram , the help doesn't say anything about forcing a full GC, however "Impact" is still said to be "high", and the

jvm分析与调优

牧云@^-^@ 提交于 2020-03-18 17:32:06
JVM的调优实际上是对GC回收的调优,减少次数 JVM模型图和GC机制: 1. 新new的对象都放在Eden区( 伊甸园嘛,创造的地方 ) 2. Eden区满或者快满的时候进行一次清理(Minor Gc),不被引用的对象直接被干掉;还有引用的对象,但是年龄比较大的,挪到S0区 3. 下次Eden区快满的时候,会进行上一步的操作,并且将Eden和S0区的年纪大的对象放到S1区【原理上随时保持S0和S1有一个是空的,用来存下一次的对象】 4. 下下次,Eden区快满的时候,会进行上一步操作,并且将Eden和S1区的年纪大的对象放到S0区【此时S1区就是空的】 5. 直到Eden区快满,S0或者S1也快满的时候,这时候就把这两个区的年纪大的对象放到Old区 6.依次循环,直到Old区也快满的时候,Eden区也快满的时候,会对整个这一块内存区域进行一次大清洗(FullGC),腾出内存,为之后的对象创建,程序运行腾地方。 清理Eden区和Survivor区叫Minor GC;清理Old区叫Major GC;清理整个堆空间—包括年轻代和老年代叫Full GC。 二.JVM参数配置 在jdk1.8以前,生产环境一般有如下配置 -XX:PermSize=512M -XX:MaxPermSize=1024M 表示在JVM里存储Java类信息,常量池和静态变量的永久代区域初始大小为512M

Why are Java objects pointers to pointers?

流过昼夜 提交于 2020-03-18 06:56:11
问题 The JVMS says that: In some of Oracle’s implementations of the Java Virtual Machine, a reference to a class instance is a pointer to a handle that is itself a pair of pointers: one to a table containing the methods of the object and a pointer to the Class object that represents the type of the object, and the other to the memory allocated from the heap for the object data. I don't understand why references would be implemented this way rather than making them a pointer to the method table

Why are Java objects pointers to pointers?

与世无争的帅哥 提交于 2020-03-18 06:56:09
问题 The JVMS says that: In some of Oracle’s implementations of the Java Virtual Machine, a reference to a class instance is a pointer to a handle that is itself a pair of pointers: one to a table containing the methods of the object and a pointer to the Class object that represents the type of the object, and the other to the memory allocated from the heap for the object data. I don't understand why references would be implemented this way rather than making them a pointer to the method table

JVM 系列(二)内存模型

别说谁变了你拦得住时间么 提交于 2020-03-18 03:52:30
02 JVM 系列(二)内存模型 一、JVM 内存组成 (1) PC 寄存器(线程私有) Java 虚拟机会为每个线程创建 PC 寄存器,在任意时刻,一个 java 线程总是在执行一个方法,这个方法被称为当前方法。 如果当前方法不是本地方法,PC 寄存器就会执行当前正在被执行的指令,如果是本地方法,则 PC 寄存器值为 undefined,寄存器存放如当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等信息。 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。 (2) Java 虚拟机栈(线程私有) 每个方法在执行的时候会创建一个栈帧,存储了局部变量表,操作数栈,动态连接,方法返回地址等。每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。通常所说的栈,一般是指虚拟机栈中的局部变量表部分。局部变量表所需的内存在编译期间完成分配。 如果线程请求的栈深度大于虚拟机所允许的深度,则 StackOverflowError。如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则 OutOfMemoryError。 (3) 本地方法栈(线程私有) 本地方法栈和 Java 栈非常类似,最大不同为本地方法栈用于本地方法调用。Java 虚拟机允许 Java 直接调用本地方法(通常使用C编写)。 也会抛出 StackOverflowError

JVM 系列(二)内存模型

半城伤御伤魂 提交于 2020-03-18 03:49:57
02 JVM 系列(二)内存模型 一、JVM 内存区域 JVM 会将 Java 进程所管理的内存划分为若干不同的数据区域。这些区域有各自的用途、创建/销毁时间: 一、 线程私有区域 线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁(在 Hotspot VM 内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的存/否跟随本地线程的生/死)。 (1) Program Counter Register(程序计数器) Java 虚拟机会为每个线程创建 PC 寄存器,在任意时刻,一个 java 线程总是在执行一个方法,这个方法被称为当前方法。 如果当前方法不是本地方法,PC 寄存器就会执行当前正在被执行的指令,如果是本地方法,则 PC 寄存器值为 undefined,寄存器存放如当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等信息。 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。 (2) Java Stack(虚拟机栈) 虚拟机栈描述的是 Java 方法执行的内存模型 :每个方法被执行时会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用至返回的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程(VM 提供了 -Xss 来指定线程的最大栈空间