精华内容
下载资源
问答
  • import java.io.InputStreamReader; import java.io.LineNumberReader; import sun.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; public class MonitorInfoTest { public ...

    展开全文
  • JAVA获取JVM内存空间和物理内存空间

    万次阅读 2018-06-28 11:32:08
    获取JVM内存空间系统环境:WINJDK版本:1.8re直接调用Runtime中相应的方法即可:public long maxMemory() Returns the maximum amount of memory that the Java virtual machine will attempt to use. If there is...

    一、获取JVM内存空间

            系统环境:WIN

            JDK版本:1.8re

            直接调用Runtime中相应的方法即可:

    public long maxMemory()
    
    Returns the maximum amount of memory that the Java virtual machine will attempt to use. 
    If there is no inherent limit then the value Long.MAX_VALUE will be returned.
    
    Returns:
        the maximum amount of memory that the virtual machine will attempt to use, measured in bytes
    Since:
        1.4 

            以上为Java8的API,maxMemory( ) 返回Java虚拟机当前状态能使用的最大内存大小。如果没有参数限制,将会返回Long.MAX_VALUE这个值。敲黑板!Long.MAX_VALUE这个值是什么呢,这个Long.MAX_VALUE是JVM能够在系统中可以扩展到的最大的内存大小。


    public long totalMemory()
    
    Returns the total amount of memory in the Java virtual machine. 
    The value returned by this method may vary over time, depending on the host environment.
    
    Note that the amount of memory required to hold an object of any given type may be implementation-dependent.
    
    Returns:
        the total amount of memory currently available for current and future objects, measured in bytes. 
             totalMemory( ) 返回Java虚拟机中的总内存。这个方法返回的值可能随时间而变化,这取决于宿主操作系统环境和JVM的内存占用情况。 需要注意的是, Note that the amount of memory required to hold an object of any given type may be implementation-dependent 。不同依赖实现的虚拟机需要的能Hold住任何类型对象所需的内存大小都不太一样。因为这取决于对象在JVM运行时是如何建立在内存中的,不同的虚拟机实现都不太一样,拿最常用的HotSpot来说,一个对象包括:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding),而且在JAVA中需要检测对象占用的内存大小,不像C中那么简单sizeof( ) 就完事了。


    public long freeMemory()
    
    Returns the amount of free memory in the Java Virtual Machine. 
    Calling the gc method may result in increasing the value returned by freeMemory.
    
    Returns:
        an approximation to the total amount of memory currently available for future allocated objects, measured in bytes. 

            freeMemory( ) 返回Java虚拟机中空闲内存的数量。这个空闲是相对于totalMemory来说的而不是maxMemory,调用GC方法可能会增大freeMemory的返回值。

    二、获取操作系统内存空间

            依靠sun.management.ManagementFactoryHelper,不多说,看代码。



    import java.lang.management.ManagementFactory;
    import com.sun.management.OperatingSystemMXBean;
    
    /**
     * JAVA获取JVM内存空间和物理内存空间
     * @author jiangyuqin
     *
     */
    public class MonitorInfoTest {
    
    	public static void main(String[] args) {
    
    		// 虚拟机级内存情况查询
    		long vmFree = 0;
    		long vmUse = 0;
    		long vmTotal = 0;
    		long vmMax = 0;
    		int byteToMb = 1024 * 1024;
    		Runtime rt = Runtime.getRuntime();
    		vmTotal = rt.totalMemory() / byteToMb;
    		vmFree = rt.freeMemory() / byteToMb;
    		vmMax = rt.maxMemory() / byteToMb;
    		vmUse = vmTotal - vmFree;
    		System.out.println("JVM内存已用的空间为:" + vmUse + " MB");
    		System.out.println("JVM内存的空闲空间为:" + vmFree + " MB");
    		System.out.println("JVM总内存空间为:" + vmTotal + " MB");
    		System.out.println("JVM总内存空间为:" + vmMax + " MB");
    
    		System.out.println("======================================");
    		// 操作系统级内存情况查询
    		OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    		String os = System.getProperty("os.name");
    		long physicalFree = osmxb.getFreePhysicalMemorySize() / byteToMb;
    		long physicalTotal = osmxb.getTotalPhysicalMemorySize() / byteToMb;
    		long physicalUse = physicalTotal - physicalFree;
    		System.out.println("操作系统的版本:" + os);
    		System.out.println("操作系统物理内存已用的空间为:" + physicalFree + " MB");
    		System.out.println("操作系统物理内存的空闲空间为:" + physicalUse + " MB");
    		System.out.println("操作系统总物理内存:" + physicalTotal + " MB");
    		
    		// 获得线程总数
    		ThreadGroup parentThread;
    		int totalThread = 0;
    		for (parentThread = Thread.currentThread().getThreadGroup(); parentThread
    				.getParent() != null; parentThread = parentThread.getParent()) {
    			totalThread = parentThread.activeCount();
    		}
    		System.out.println("获得线程总数:" + totalThread);
    	}
    }

    运行时加上参数:-Xms512m -Xmx1024m


    展开全文
  • Carson带你学JVM:图文解析Java虚拟机内存结构

    万次阅读 多人点赞 2019-09-29 07:33:11
    本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢

    前言

    • 了解Java中的对象、变量等存放的内存区域十分重要
    • 本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢

    Carson带你学JVM系列文章,具体如下:
    Carson带你学JVM:这是一份全面 & 详细的JVM学习指南
    Carson带你学JVM:图文解析Java虚拟机内存结构
    Carson带你学JVM:Java对象的创建、内存布局 & 访问定位全过程解析
    Carson带你学JVM:Java对象如何判断存活原则-引用计数法 & 引用链法
    Carson带你学JVM:这是一份全面 & 详细的垃圾收集算法(GC)讲解攻略
    Carson带你学JVM:常见的垃圾收集器学习指南
    Carson带你学JVM:类加载的全过程解析
    Carson带你学JVM:你真的了解类加载器吗?(含双亲委派模型)
    Carson带你学JVM:方法分派模型-静态分派、动态分派


    目录

    示意图


    1. 内存模型 & 分区

    • Java虚拟机在运行Java程序时,会管理着一块内存区域:运行时数据区
    • 在运行时数据区里,会根据用途进行划分:
      1. Java虚拟机栈(栈区)
      2. 本地方法栈
      3. Java堆(堆区)
      4. 方法区
      5. 程序计数器

    示意图

    • 下面,我将详细介绍每个内存模型分区

    2. Java堆

    • 示意图
      示意图

    • 简介

    示意图

    关于垃圾回收的讲解会在接下来推出的文章里讲解


    3. Java虚拟机栈

    • 示意图
      示意图

    • 简介

    示意图


    4. 本地方法栈

    • 示意图

    示意图

    • 简介
      十分类似Java虚拟机栈,与Java虚拟机区别在于:服务对象,即
      Java虚拟机栈为执行 Java 方法服务;本地方法栈为执行 Native方法服务

    5. 方法区

    • 示意图
      示意图

    • 简介

    示意图


    • 其内部包含一个运行时常量池,具体介绍如下:

    示意图


    6. 程序计数器

    • 示意图

    示意图

    • 简介

    示意图


    7. 额外知识:直接内存

    • 定义:NIO类(JDK1.4引入)中基于通道和缓冲区的I/O方式 通过使用Native函数库 直接分配 的堆外内存
    • 特点:不受堆大小限制

    不属于虚拟机运行时数据区的一部分 & 不在堆中分配

    • 应用场景:适用于频繁调用的场景

    通过一个 存储在Java堆中的DirectByteBuffer对象 作为这块内存的引用 进行操作,从而避免在 Java 堆和 Native堆之间来回复制数据,提高使用性能

    • 抛出的异常:OutOfMemoryError,即与其他内存区域的总和 大于 物理内存限制

    8. 总结

    本文全面讲解JVM中的内存模型 & 分区,总结如下

    示意图

    Carson带你学JVM系列文章,具体如下:
    Carson带你学JVM:这是一份全面 & 详细的JVM学习指南
    Carson带你学JVM:图文解析Java虚拟机内存结构
    Carson带你学JVM:Java对象的创建、内存布局 & 访问定位全过程解析
    Carson带你学JVM:Java对象如何判断存活原则-引用计数法 & 引用链法
    Carson带你学JVM:这是一份全面 & 详细的垃圾收集算法(GC)讲解攻略
    Carson带你学JVM:常见的垃圾收集器学习指南
    Carson带你学JVM:类加载的全过程解析
    Carson带你学JVM:你真的了解类加载器吗?(含双亲委派模型)
    Carson带你学JVM:方法分派模型-静态分派、动态分派


    欢迎关注Carson_Ho的CSDN博客 与 公众号!

    博客链接:https://carsonho.blog.csdn.net/


    请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

    展开全文
  • # pmap -x 3317 Address Kbytes RSS Dirty Mode Mapping 0000000041b5d000 4 0 0 ----- [ anon ] 0000000041b5e000 256 40 40 rwx-- [ anon ] 0000000041ba4000 4 0 0 ----- [ anon ] 0000000041ba5000 10240 64 64 ...
  • 比如本文我们要讨论的JVM内存结构、JAVA内存结构、JAVA内存区域、Java内存模型,这就是几个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、JAVA内存结构、JAVA内存...

    Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、JAVA内存结构、JAVA内存区域Java内存模型,这就是几个截然不同的概念,但是很多人容易弄混。

    可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、JAVA内存结构、JAVA内存区域Java内存模型这几个的概念及其间的区别。甚至我见过有些面试官自己也搞的不是太清楚。不信的话,你去网上搜索Java内存模型,还会有很多文章的内容其实介绍的是JVM内存结构。

    前提:

    本文讲的基本都是以Sun HotSpot虚拟机为基础的,Oracle收购了Sun后目前得到了两个【Sun的HotSpot和JRockit(以后可能合并这两个),还有一个是IBM的IBMJVM】

    前一篇文章 编程的基础知识:CPU和内存的交互以及volatile型变量的理解

    之所以扯了那么多计算机内存模型,是因为java内存模型的设定符合了计算机的规范。

    JVM内存结构、Java内存结构、Java内存区域

    这三者都是一个概念

    我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。

    JVM运行时内存结构(也就是咱们常说的运行时数据区)

    五大内存区域

    程序计数器

    程序计数器是一块很小的内存空间,它是线程私有的,可以认作为当前线程的行号指示器。

    为什么需要程序计数器

    我们知道对于一个处理器(如果是多核cpu那就是一核),在一个确定的时刻都只会执行一条线程中的指令,一条线程中有多个指令,为了线程切换可以恢复到正确执行位置,每个线程都需有独立的一个程序计数器,不同线程之间的程序计数器互不影响,独立存储。

    注意:如果线程执行的是个java方法,那么计数器记录虚拟机字节码指令的地址。如果为native【底层方法】,那么计数器为空。这块内存区域是虚拟机规范中唯一没有OutOfMemoryError的区域

    Java栈(虚拟机栈)

    同计数器也为线程私有,生命周期与相同,就是我们平时说的栈,栈描述的是Java方法执行的内存模型

    每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。【栈先进后出,下图栈1先进最后出来】

    对于栈帧的解释参考 Java虚拟机运行时栈帧结构

    栈帧: 是用来存储数据和部分过程结果的数据结构。
    栈帧的位置:  内存 -> 运行时数据区 -> 某个线程对应的虚拟机栈 -> here[在这里]
    栈帧大小确定时间: 编译期确定,不受运行期数据影响。
    

    通常有人将java内存区分为栈和堆,实际上java内存比这复杂,这么区分可能是因为我们最关注,与对象内存分配关系最密切的是这两个。

    平时说的栈一般指局部变量表部分。

    局部变量表:一片连续的内存空间,用来存放方法参数,以及方法内定义的局部变量,存放着编译期间已知的数据类型(八大基本类型和对象引用(reference类型),returnAddress类型。它的最小的局部变量表空间单位为Slot,虚拟机没有指明Slot的大小,但在jvm中,long和double类型数据明确规定为64位,这两个类型占2个Slot,其它基本类型固定占用1个Slot。

    reference类型:与基本类型不同的是它不等同本身,即使是String,内部也是char数组组成,它可能是指向一个对象起始位置指针,也可能指向一个代表对象的句柄或其他与该对象有关的位置。

    returnAddress类型:指向一条字节码指令的地址【深入理解Java虚拟机】怎么理解returnAddress

    需要注意的是,局部变量表所需要的内存空间在编译期完成分配,当进入一个方法时,这个方法在栈中需要分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表大小。

    Java虚拟机栈可能出现两种类型的异常:

    1. 线程请求的栈深度大于虚拟机允许的栈深度,将抛出StackOverflowError。
    2. 虚拟机栈空间可以动态扩展,当动态扩展是无法申请到足够的空间时,抛出OutOfMemory异常。

    本地方法栈

    本地方法栈是与虚拟机栈发挥的作用十分相似,区别是虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++,我们打开jdk安装目录可以看到也有很多用c编写的文件,可能就是native方法所调用的c代码。

    对于大多数应用来说,堆是java虚拟机管理内存最大的一块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候也需要同步机制。因此需要重点了解下。

    java虚拟机规范对这块的描述是:所有对象实例及数组都要在堆上分配内存,但随着JIT编译器的发展和逃逸分析技术的成熟,这个说法也不是那么绝对,但是大多数情况都是这样的。

    即时编译器:可以把把Java的字节码,包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序)

    逃逸分析:通过逃逸分析来决定某些实例或者变量是否要在堆中进行分配,如果开启了逃逸分析,即可将这些变量直接在栈上进行分配,而非堆上进行分配。这些变量的指针可以被全局所引用,或者其其它线程所引用。

    参考逃逸分析

    注意:它是所有线程共享的,它的目的是存放对象实例。同时它也是GC所管理的主要区域,因此常被称为GC堆,又由于现在收集器常使用分代算法,Java堆中还可以细分为新生代和老年代,再细致点还有Eden(伊甸园)空间之类的不做深究。

    根据虚拟机规范,Java堆可以存在物理上不连续的内存空间,就像磁盘空间只要逻辑是连续的即可。它的内存大小可以设为固定大小,也可以扩展。

    当前主流的虚拟机如HotPot都能按扩展实现(通过设置 -Xmx和-Xms),如果堆中没有内存内存完成实例分配,而且堆无法扩展将报OOM错误(OutOfMemoryError)

    方法区

    方法区同堆一样,是所有线程共享的内存区域,为了区分堆,又被称为非堆。

    用于存储已被虚拟机加载的类信息、常量、静态变量,如static修饰的变量加载类的时候就被加载到方法区中。

    运行时常量池

    是方法区的一部分,class文件除了有类的字段、接口、方法等描述信息之外,还有常量池用于存放编译期间生成的各种字面量和符号引用。

    在老版jdk,方法区也被称为永久代【因为没有强制要求方法区必须实现垃圾回收,HotSpot虚拟机以永久代来实现方法区,从而JVM的垃圾收集器可以像管理堆区一样管理这部分区域,从而不需要专门为这部分设计垃圾回收机制。不过自从JDK7之后,Hotspot虚拟机便将运行时常量池从永久代移除了。】

    jdk1.7开始逐步去永久代。从String.interns()方法可以看出来 String.interns()

    native方法:

    作用是如果字符串常量池已经包含一个等于这个String对象的字符串,则返回代表池中的这个字符串的String对象,在jdk1.6及以前常量池分配在永久代中。

    可通过 -XX:PermSize和-XX:MaxPermSize限制方法区大小。

    public class StringIntern {
        //运行如下代码探究运行时常量池的位置
        public static void main(String[] args) throws Throwable {
            //用list保持着引用 防止full gc回收常量池
            List<String> list = new ArrayList<String>();
            int i = 0;
            while(true){
                list.add(String.valueOf(i++).intern());
            }
        }
    }
    //如果在jdk1.6环境下运行 同时限制方法区大小 将报OOM后面跟着PermGen space说明方法区OOM,即常量池在永久代
    //如果是jdk1.7或1.8环境下运行 同时限制堆的大小  将报heap space 即常量池在堆中

    idea设置相关内存大小设置

    这边不用全局的方式,设置main方法的vm参数。

    做相关设置,比如说这边设定堆大小。(-Xmx5m -Xms5m -XX:-UseGCOverheadLimit)

    jdk8真正开始废弃永久代,而使用元空间(Metaspace)

    java虚拟机对方法区比较宽松,除了跟堆一样可以不存在连续的内存空间,定义空间和可扩展空间,还可以选择不实现垃圾收集。

    总结

    这里简单提几个需要特别注意的点:

    1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范。

    2、规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能。但是并没有规定这个区域到底应该处于何处。所以,对于不同的虚拟机实现来说,是由一定的自由度的。

    3、不同版本的方法区所处位置不同,上图中划分的是逻辑区域,并不是绝对意义上的物理区域。因为某些版本的JDK中方法区其实是在堆中实现的。

    4、运行时常量池用于存放编译期生成的各种字面量和符号应用。但是,Java语言并不要求常量只有在编译期才能产生。比如在运行期,String.intern也会把新的常量放入池中。

    5、除了以上介绍的JVM运行时内存外,还有一块内存区域可供使用,那就是直接内存。Java虚拟机规范并没有定义这块内存区域,所以他并不由JVM管理,是利用本地方法库直接在堆外申请的内存区域。

    6、堆和栈的数据划分也不是绝对的,如HotSpot的JIT会针对对象分配做相应的优化。

    如上,做个总结,JVM内存结构,由Java虚拟机规范定义。描述的是Java程序执行过程中,由JVM管理的不同数据区域。各个区域有其特定的功能。

    Java内存模型

    Java程序内存的分配是在JVM虚拟机内存分配机制下完成

    Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。

    简要言之,jmm是jvm的一种规范,定义了jvm的内存模型。它屏蔽了各种硬件和操作系统的访问差异,不像c那样直接访问硬件内存,相对安全很多,它的主要目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。可以保证并发编程场景中的原子性、可见性和有序性。

    Java内存模型看上去和Java内存结构(JVM内存结构)差不多,很多人会误以为两者是一回事儿,这也就导致面试过程中经常答非所为。

    在前面的关于JVM的内存结构的图中,我们可以看到,其中Java堆和方法区的区域是多个线程共享的数据区域。也就是说,多个线程可能可以操作保存在堆或者方法区中的同一个数据。这也就是我们常说的“Java的线程间通过共享内存进行通信”。

    Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。JSR-133: Java Memory Model and Thread Specification中描述了,JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。

    那么,简单总结下,Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。

    在Java中,JMM是一个非常重要的概念,正是由于有了JMM,Java的并发编程才能避免很多问题。这里就不对Java内存模型做更加详细的介绍了,想了解更多的朋友可以参考《Java并发编程的艺术》。

    内存溢出

    两种内存溢出异常[注意内存溢出是error级别的]
    1.StackOverFlowError:当请求的栈深度大于虚拟机所允许的最大深度
    2.OutOfMemoryError:虚拟机在扩展栈时无法申请到足够的内存空间[一般都能设置扩大]
    

    java -verbose:class -version 可以查看刚开始加载的类,可以发现这两个类并不是异常出现的时候才去加载,而是jvm启动的时候就已经加载。这么做的原因是在vm启动过程中我们把类加载起来,并创建几个没有堆栈的对象缓存起来,只需要设置下不同的提示信息即可,当需要抛出特定类型的OutOfMemoryError异常的时候,就直接拿出缓存里的这几个对象就可以了。

    比如说OutOfMemoryError对象,jvm预留出4个对象【固定常量】,这就为什么最多出现4次有堆栈的OutOfMemoryError异常及大部分情况下都将看到没有堆栈的OutOfMemoryError对象的原因。

    参考OutOfMemoryError解读

    两个基本的例子

    public class MemErrorTest {
        public static void main(String[] args) {
            try {
                List<Object> list = new ArrayList<Object>();
                for(;;) {
                    list.add(new Object()); //创建对象速度可能高于jvm回收速度
                }
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            }
    
            try {
                //递归造成StackOverflowError 这边因为每运行一个方法将创建一个栈帧,
                //栈帧创建太多无法继续申请到内存扩展
                hi();
            } catch (StackOverflowError e) {
                e.printStackTrace();
            }
    
        }
    
        public static void hi() {
            hi();
        }
    }

     

    参考资料:

    JVM内存结构、Java内存模型以及Java对象模型之间的区别:https://blog.csdn.net/ZYC88888/article/details/83756364

    深入理解JVM-内存模型(jmm)和GC:https://www.jianshu.com/p/76959115d486

    展开全文
  • Java 虚拟机内存分配机制

    千次阅读 2017-09-15 15:34:45
    对于大多数的程序员来说,Java 内存比较流行的说法便是堆和栈,这其实是非常粗略的一种划分,这种划分的“堆”对应内存模型的 Java 堆,“栈”是指虚拟机栈,然而 Java 内存模型远比这更复杂,想深入了解 Java 的...
  • Java JVM 内存解析

    千次阅读 2018-11-28 15:30:07
    文章目录Java JVM 内存解析1、最大可用内存 -Xmx2、虚拟机中可用内存量3、虚拟机总内存量4、虚拟机当前实际可用内存5、Log 方法 Java JVM 内存解析 1、最大可用内存 -Xmx 设置虚拟机最大可以使用的内存总量 // JDK...
  • java虚拟机内存设置

    千次阅读 2016-12-22 14:48:33
    原文地址:... JVM(java 虚拟机)内存设置 ...-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而
  • Java虚拟内存研究

    2011-12-17 10:34:01
    Java虚拟内存研究,值得参考
  • java -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps -XX:-PrintCommandLineFlags -Xmx`free -m | grep Mem\: | awk '{print $2}' | xargs -i expr....
  • 全面理解Java内存模型(JMM)及volatile关键字

    万次阅读 多人点赞 2017-06-12 11:25:05
    【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) ... 出自【zejian的博客】...深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深...
  • Java虚拟内存

    千次阅读 2016-09-08 11:28:51
    可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。  参数描述  -Xms JVM初始化堆...
  • Java内存模型

    千次阅读 2017-05-15 09:31:28
    Java的世界也有属于它自己的内存模型,Java内存模型,即Java Memory Model,简称JMM。由于Java被定义成一种跨平台的语言,所以在内存的描述上面也要能是跨平台的,Java虚拟机试图定义一种统一的
  • Java直接内存详解

    千次阅读 2017-12-10 10:46:17
    由于对直接内存的概念不是很清晰,所以查询了相关资料,准备一篇博文总结一下什么是直接内存直接内存(Direct Memory)就是Java堆外内存直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的...
  • java 直接内存

    千次阅读 2016-03-11 17:24:58
    直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现,所以我们放到这里一起讲解。...
  • java虚拟机内存大小调整:

    千次阅读 2014-11-21 01:05:48
    -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值; ...
  • java内存模型

    千次阅读 多人点赞 2018-11-09 13:09:55
    java内存模型 下图就是java内存模型,但是一般讨论的时候不会画这个图,一般画的是java内存模型抽象结构图(在下文)。Thread Stack就是java内存模型抽象结构图中的本地内存,Heap就是java内存模型抽象结构图中的主...
  • java 获取进程ID Java代码  import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.math.BigDecim
  • java内存配置

    千次阅读 2018-06-22 09:00:31
    Java内存总结1. 内存分配的基本规则①.对象优先在新生代Eden分配,当Eden不够时,将进行一次MinorGC②.大对象之间进入老年代,比如像很长的字符串,数组等③.长期存活的对象将进入老年代,每经过一次MinorGC就...
  • JAVA内存结构

    万次阅读 多人点赞 2018-08-01 09:41:28
    JVM所管理的内存包括以下几个运行时数据区域,如图所示 方法区和堆为线程共享区,虚拟机栈、本地方法栈及程序计数器为线程独占区。 程序计数器 程序计数器是一块较小的空间,它可以看作是当前...
  • 1、物理内存模型带来的问题 2、伪共享 3、Java内存模型(JMM) 4、Java内存模型带来的问题 4.1 可见性问题 4.2 竞争问题 4.3 重排序 5、volatile详解 5.1 volatile特性 5.2 volatile的内存语义 5.3 ...
  • java 虚拟机内存大小的调整方法

    千次阅读 2014-10-11 18:44:44
    -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值; -...
  • 首先我们要了解物理地址,当CPU需要访问一个内存单元时,需要给出内存单元的地址,而每一个内存单元在物理内存空间中都有一个唯一的地址,即可以通过这个地址定位到内存单元,而这个地址即为物理地址。CPU通过地址...
  • java读取CPU内存信息

    2013-04-06 16:04:24
    java读取当前机器的可使用内存,剩余内存,最大可使用内存,操作系统,总的物理内存,剩余的物理内存,已使用的物理内存,获得线程总数
  • Java并发编程】Java内存模型

    千次阅读 2019-10-24 20:09:03
    文章目录Java内存模型一、JMM解析二、硬件内存架构三、JMM与硬件内存架构的关联四、Java线程与计算机主内存之间的抽象关系五、Java内存模型中同步八种操作 Java内存模型 一、JMM解析 之前写过一篇文章【Java核心技术...
  • Java虚拟机内存调整

    千次阅读 2010-04-22 19:24:00
    Java虚拟机默认分配64M内存,如果你的应用比较大,超出64M内存,Java虚拟机就会抛出OutOfMemoryError,并停止运行。...当然,这儿的内存容量都是指物理内存,不能超出你的机器的物理内存的总容量。 关于
  • java虚拟机系列:java虚拟机内存模型

    千次阅读 2018-08-02 14:39:25
    java内存模型,分为程序计数器,虚拟机栈,本地方法栈,java堆,java栈。根据受访的权限不同设置,可以分为线程共享和线程私有。线程共享指可以允许所有的线程共享访问的一类内存区域,包括堆内存区,方法区,运行的...
  • Java内存区域与内存溢出

    千次阅读 2020-02-09 17:27:55
    内容参考《深入理解JVM虚拟机》,本文JVM均指HotSpot虚拟机。 Java与C语言针对“内存管理”...而在Java中,内存由JVM管理,垃圾回收器GC会帮助开发者自动回收不再被引用的对象来释放内存,使得Java不太会像C语言那...
  • 本来打算自己写个总结,但是看了一篇文章后,自觉很难超出其文,就直接copy过来啦 ,然后本地写了大概笔记,算是...Java垃圾回收概况Java内存区域Java对象的访问方式Java内存分配机制Java GC机制垃圾收集器 Java垃圾
  • java虚拟机内存

    千次阅读 2018-08-05 11:22:56
    1、JDK(java development Kit) 包括 java程序设计语言、java虚拟机、Java API类库 三部分, 是支持java程序开发的最小环境。 JRE(java Runtime Enviromet)包括 Java API类库中的Java SE API子集和java虚拟机 两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,798
精华内容 74,719
关键字:

java物理内存

java 订阅