JVM内存管理

一:  首先弄明白两个概念:物理内存和虚拟内存

  •   物理内存:通常所说的RAM(随机存储器),有一个存储单元寄存器,存储计算单元执行指令的中间结果。物理内存是真实存在的,例如:内存条
  •   虚拟内存:利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘被称作交换空间。虚拟内存保证多个线程同时执行时可以共享同一块物理内存。但只是空间上共享,逻辑上不是共享的,而且相互支架不能直接访问。

二:       什么是内核?什么是用户空间?

  • ·  内核是操作系统运行时所需要的内存,也就是系统空间。
  •          用户空间是提供给用户线程使用的一部分空间。

  内核空间是是用来存放系统进程数据的;用户空间使用来存放用户进程数据的。如果不进行划分,就会造成数据混乱,影响系统的正常运行。分开存放保证了操作系统和用户进程之间互不影响,保证系统的稳定性,同时也便于管理。更重要的是将用户数据和系统数据隔离,就能够对各个部分的数据访问进行控制。这样就保障了用户进程不能够修改系统进程,防止用户进程恶意修改系统进程,影响系统进程的使用。

三:内部溢出和内存泄漏

  1.   内部溢出:程序再申请内存时,如果没有足够的内存空间,就会抛出out of memory    
  2.      内存泄漏:  应该被垃圾回收的对象,却没有被回收,导致内存空间被浪费,这就是内存溢出。内存泄漏可能导致内存溢出。
  •   内存溢出产生的原因:
      •     一次加载的数据量过大,
      •        集合中存在对象的引用,但是是用完之后,没有被垃圾回收,产生内存泄漏,导致内存溢出。
      •        代码中存在死循环或者产生过多的重复对象
    •  内存溢出的解决方案:
      •   修改虚拟机的启动内存,增加内存空间(-Xms -Xmx)
      •        检查日志,查看导致内存溢出的原因,然后找出解决的方案
      •         检查代码,找出可能发生内存溢出的代码,就行修改       

四:JVM内存分配策略

  •   静态内存分布:在编译时就可以确定对象需要的空间大小,在编译的过程中就一次性分配内存空间,
  •        堆内存分布:    编译期间并不知道需要的空间大小,只有当程序运行到响应的代码时,才知道空间的大小,这时候进行内存空间的分配。
  •        栈内存分配:     动态存储分布,在程序运行时分配内存空间,是一种先进后出的分配策略

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

Java并发之嵌套管程锁死(Nested Monitor Lockout)具体的嵌套管程死锁的例子Nested Monitor Lockout vs. Deadlock

可以看到,lock()方法首先在”this”上同步,然后在monitorObject上同步。如果isLocked等于false,因为线程不会继续调用monito...

711
来自专栏不会写文章的程序员不是好厨师

利用LockSupport实现互斥锁和共享锁

首先说说LockSupport吧,它的作用是提供一组直接block或unblock线程的方法,其底层实现利用了Unsafe(前面文章有讲过Unsafe)。Loc...

882
来自专栏海说

Dubbo源码学习--服务发布(ServiceBean、ServiceConfig)

前面讲过Dubbo SPI拓展机制,通过ExtensionLoader实现可插拔加载拓展,本节将接着分析Dubbo的服务发布过程。 以源码中dubbo-demo...

3130
来自专栏老马说编程

(71) 显式锁 / 计算机程序的思维逻辑

查看历史文章,请点击上方链接关注公众号。 在66节,我们介绍了利用synchronized实现锁,我们提到了synchronized的一些局限性,本节,我们探讨...

1795
来自专栏瞎说开发那些事

[Java并发系列] Java并发机制的底层实现

1365
来自专栏Golang语言社区

golang的垃圾回收(GC)机制

golang的垃圾回收采用的是 标记-清理(Mark-and-Sweep) 算法 就是先标记出需要回收的内存对象快,然后在清理掉; 在这里不介绍标记和清理的具体...

3897
来自专栏Java技术栈

深入理解CAS算法原理

1、什么是CAS? CAS:Compare and Swap,即比较再交换。 jdk5增加了并发包java.util.concurrent.*,其下面的类使用...

4238
来自专栏Ryan Miao

java线程(2)--同步和锁

参考转载:http://rainyear.iteye.com/blog/1734311 http://turandot.iteye.com/blog/17040...

3387
来自专栏Java面试笔试题

与线程同步以及线程调度相关的方法

701
来自专栏javathings

Java 中什么是无锁编程?

多线程环境下,为了保证数据不受到并发操作的影响,通常会采用加锁的策略保证一致性。除了加锁之外,还有一种方式就是采用无锁编程。

472

扫码关注云+社区