jvm

How JVM -XX:MaxRAM option can be correctly used? [duplicate]

亡梦爱人 提交于 2020-04-16 02:26:14
问题 This question already has answers here : Setting -XX:MaxRam (3 answers) Closed last month . I run a java application with the following parameters: #!/bin/bash export JVM_OPTS="-XX:MaxRAM=150m" export JVM_OPTS="$JVM_OPTS -XX:+UseSerialGC" java $JVM_OPTS -jar application.jar The htop shows: VIRT=475M RES=238M SHR=4880 MEM%=24.1 As I understand it, I need to look at the RES parameter. But in this case, it greatly exceeds -XX:MaxRAM . Expected that in this case, OutOfMemoryException will happen.

二:JVM学习-垃圾收集算法以及常用的垃圾收集器

你。 提交于 2020-04-12 17:38:53
垃圾收集器与内存分配策略简介: 一:垃圾收集算法 1.1:简介 说起垃圾收集,大部分人都把这项技术当做java语言的伴生物,其实,GC的历史比java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言,档Lisp在胚胎的时候,人们就在考虑GC需要完成的三件事情: 1:那些内存需要回收 2:什么时候回收 3:如何回收 1.2:垃圾收集算法: 由于笔者也是刚开始学习,对算法的具体实现不甚了解,所以请见谅。 1.2.1标记-清除算法 该算法也是最基础的收集算法,就给名字一样,分为标记和清除两部分,首先标记处所有需要清理的对象,然后在标记完成之后在统一回收。该算法的最大缺点就是标记清除之后会产生大量不连续的内存碎片,空间碎片化太高可能会导致,当程序在以后的运行霍城中需要分配大对象的时候没有办法找到连续的空间再去触发一次垃圾回收动作,有点得不偿失,还有一点就是该算法的收集效率也不是太高。如下所示: 1.2.2:复制算法: 为了解决效率问题,一种称为“复制”算法的收集算法出现了,他讲容量划分为大小相等的两块,每次只是用一块,当一块内存块用完之后,就把存活的对象复制到另一块上去,然后把已经使用过的内存空间一次清理掉,这样使得每次都对其中一块进行垃圾回收,再次进行内存分配的时候也不用考虑空间碎片化的问题。这种算法也有坏处就是内存压缩为原来的一半,利用率比较低

JVM虚拟机中的运行时数据区域概念描述

浪子不回头ぞ 提交于 2020-04-09 20:27:01
java虚拟机所管理的内存包含以下几个运行时数据区域 : 1.方法区(method Area) 2.虚拟机栈(vm stack) 3.本地方法栈(native method stack) 4.堆(heap) 5.程序计数器 1和4是由所有线程共享的数据区 2,3,5是线程隔离的数据区 程序计数器: 这是一块很小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。 在jvm的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 另外 分支 循环 跳转 异常处理 线程恢复等基础功能都需要他来完成。 JVM多线程实现:通过线程轮流切换并分配处理器执行时间的方式来实现的。 所以为了切换换成后能恢复到正确的执行位置,每条线程都要有一个独立计数器,互不影响,独立存储,我们称这类内存区域为线程私有的内存。 如果线程正在执行java方法,则计数器记录的是正在执行的虚拟机字节码指定地址。如果正在执行native方法,则计数器值为空。 程序计数器是jvm中没有规定内存溢出错误的区域。 栈: 栈是线程私有的,生命周期和线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直到执行完成的过程,对应着一个栈帧在jvm中入栈到出栈的过程。 栈被称为局部变量表

【转】HotSpot虚拟机对象探秘

冷暖自知 提交于 2020-04-09 19:53:46
请读者首先注意本篇的题目中的限定语“HotSpot虚拟机”,在虚拟机规范中明确写道, 所有在虚拟机规范之中没有明确描述的实现细节,都不应成为虚拟机设计者发挥创造性的牵绊,设计者可以完全自主决定所有规范中不曾描述的虚拟机内部细节。 例如:运行时数据区的内存如何布局、选用哪种垃圾收集的算法等”。因此,本篇(整个内存篇中所有的文章)的内容会涉及到虚拟机“自主决定”的实现,我们的讨论将在HotSpot VM的范围内展开。同时,我也假定读者已经理解了虚拟机规范中所定义的JVM公共内存模型,例如运行时数据区域、栈帧结构等基础知识,如果读者对这些内容有疑问,可以先阅读《Java虚拟机规范(JavaSE 7 Editon)》[注1]第2章或《深入理解Java虚拟机:JVM高级特性与最佳实践》[注2]的第2、3章相关内容。 对象的创建 Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常(例外:克隆、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(本文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过的。如果没有,那必须先执行相应的类加载过程。

Android Studio is using this JDK location … which is different to what Gradle uses by default

倾然丶 夕夏残阳落幕 提交于 2020-04-09 02:18:36
问题 After Android Studio sync my gradle project, I see the following message in the event log: Android Studio is using this JDK location: /path/to/my/project/specific/jdk which is different to what Gradle uses by default: /path/to/android/studio/embedded/jdk Using different locations may spawn multiple Gradle daemons if Gradle tasks are run from command line while using Android Studio. Set Android Studio to use the same JDK as Gradle and sync project I have /path/to/my/project/specific/jdk set in

Android Studio is using this JDK location … which is different to what Gradle uses by default

不羁的心 提交于 2020-04-09 02:14:21
问题 After Android Studio sync my gradle project, I see the following message in the event log: Android Studio is using this JDK location: /path/to/my/project/specific/jdk which is different to what Gradle uses by default: /path/to/android/studio/embedded/jdk Using different locations may spawn multiple Gradle daemons if Gradle tasks are run from command line while using Android Studio. Set Android Studio to use the same JDK as Gradle and sync project I have /path/to/my/project/specific/jdk set in

Android Studio is using this JDK location … which is different to what Gradle uses by default

不羁的心 提交于 2020-04-09 02:12:17
问题 After Android Studio sync my gradle project, I see the following message in the event log: Android Studio is using this JDK location: /path/to/my/project/specific/jdk which is different to what Gradle uses by default: /path/to/android/studio/embedded/jdk Using different locations may spawn multiple Gradle daemons if Gradle tasks are run from command line while using Android Studio. Set Android Studio to use the same JDK as Gradle and sync project I have /path/to/my/project/specific/jdk set in

Android Studio is using this JDK location … which is different to what Gradle uses by default

試著忘記壹切 提交于 2020-04-09 02:09:21
问题 After Android Studio sync my gradle project, I see the following message in the event log: Android Studio is using this JDK location: /path/to/my/project/specific/jdk which is different to what Gradle uses by default: /path/to/android/studio/embedded/jdk Using different locations may spawn multiple Gradle daemons if Gradle tasks are run from command line while using Android Studio. Set Android Studio to use the same JDK as Gradle and sync project I have /path/to/my/project/specific/jdk set in

JVM实用参数(四)内存调优

混江龙づ霸主 提交于 2020-04-08 13:15:35
理想的情况下,一个Java程序使用JVM的默认设置也可以运行得很好,所以一般来说,没有必要设置任何JVM参数。然而,由于一些性能问题(很不幸的是,这些问题经常出现),一些相关的JVM参数知识会是我们工作中得好伙伴。在这篇文章中,我们将介绍一些关于JVM内存管理的参数。知道并理解这些参数,将对开发者和运维人员很有帮助。 所有已制定的HotSpot内存管理和垃圾回收算法都基于一个相同的堆内存划分:新生代(young generation)里存储着新分配的和较年轻的对象,老年代(old generation)里存储着长寿的对象。在此之外,永久代(permanent generation)存储着那些需要伴随整个JVM生命周期的对象,比如,已加载的对象的类定义或者String对象内部Cache。接下来,我们将假设堆内存是按照新生代、老年代和永久代这一经典策略划分的。然而,其他的一些堆内存划分策略也是可行的,一个突出的例子就是新的G1垃圾回收器,它模糊了新生代和老年代之间的区别。此外,目前的开发进程似乎表明在未来的HotSpot JVM版本中,将不会区分老年代和永久代。 -Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize) -Xms和-Xmx可以说是最流行的JVM参数,它们可以允许我们指定JVM的初始和最大堆内存大小。一般来说

[转帖]JVM源码分析之安全点safepoint

懵懂的女人 提交于 2020-04-08 08:52:36
JVM源码分析之安全点safepoint https://www.jianshu.com/p/c79c5e02ebe6 原来是这个意思.. 简书 占小狼 转载请注明原创出处,谢谢! 上周有幸参加了一次关于JVM的小范围分享会,听完R大对虚拟机C2编译器的讲解,我的膝盖一直是肿的,能记住的实在有点少,能听进去也不多 1、什么时候进行C2编译,如何进行C2编译(这个实在太复杂) 2、C2编译的时候,是对整个方法体进行编译,而不是某个方法段 3、JVM中的safepoint 一直都知道,当发生GC时,正在执行Java code的线程必须全部停下来,才可以进行垃圾回收,这就是熟悉的STW(stop the world),但是STW的背后实现原理,比如这些线程如何暂停、又如何恢复?就比较疑惑了。 然而这一切的一切,都涉及到一个概念safepoint,openjdk的实现位于 openjdk/hotspot/src/share/vm/runtime/safepoint.cpp 什么是safepoint safepoint可以用在不同地方,比如GC、Deoptimization,在Hotspot VM中,GC safepoint比较常见,需要一个数据结构记录每个线程的调用栈、寄存器等一些重要的数据区域里什么地方包含了GC管理的指针。 从线程角度看