有没有即懂C++又懂Java的道友?

前段时间翻看自己多年以来攒下的满满家当 , 突然有一种满满的满足感 .
但是想想多年来找资料的艰辛 , 决定将这些文档整理出来, 分享给大家 .
笔记华而不实 , 其中可能也有不正确的地方 , 欢迎指正. 
在此也感谢道友们的奉献 , 文档暂分为几个:

另外还有其他的笔记会陆陆续续的分享处理 , 谢谢大家的支持 .

1 . 1 常见的内存溢出

> 元空间溢出 , 元数据区的内存溢出 > 直接内存溢出 > 虚拟机栈和本地方法栈溢出 > 运行时常量池溢出 > 方法区的内存溢出

1 . 2 内存溢出的常见原因


1 . 3 系统的线程划分

: 用单线程处理所有垃圾回收工作 , 效率高 : 数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用 : “对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用 > 并发处理器: : 对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用 我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用 - 对象通过引用指向实际的内存空间 , 而指向的即为对应的指针 , 在堆内存中 , 一片内存被一个指针一份为2 , 左边为已经分配内存的空间,右侧为空 , 每一次有新的对象创建,指针就会向右移动一个对象size的距离。这就被称为指针碰撞 , 但是当多线程高并发情况下 , 会出现指针来不及修改的情况 TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域。 如果设置了虚拟机参数 -XX:UseTLAB,在线程初始化时,同时也会申请一块指定大小的内存,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。 TLAB空间的内存非常小,缺省情况下仅占有整个Eden空间的1%,也可以通过选项-XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。 TLAB的本质其实是三个指针管理的区域:start,top 和 end,每个线程都会从Eden分配一块空间,例如说100KB,作为自己的TLAB,其中 start 和 end 是占位用的,标识出 eden 里被这个 TLAB 所管理的区域,卡住eden里的一块空间不让其它线程来这里分配。 TLAB只是让每个线程有私有的分配指针,但底下存对象的内存空间还是给所有线程访问的,只是其它线程无法在这个区域分配而已。 1,TLAB空间大小是固定的,但是这时候一个大对象,我TLAB剩余的空间已经容不下它了。(比如100kb的TLAB,来了个110KB的对象) 2,TLAB空间还剩一点点没有用到,有点舍不得。 3,Eden空间够的时候,你再次申请TLAB没问题,我不够了,Heap的Eden区要开始GC, 4,TLAB允许浪费空间,导致Eden区空间不连续,积少成多。以后还要人帮忙打理。
Java 虚拟机,是一个可以执行 Java 字节码的虚拟机进程 , 它允许Java 查询在多个任意平台使用 , 但是跨平台的是 Java 程序(包括字节码文件) , 而不是 JVM
> 类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到 JVM 中。
> 内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者 PC 指针的记录器等。
> 执行引擎,执行引擎的任务是负责执行 class 文件中包含的字节码指令,相当于实际机器上的 CPU 。
> 本地方法调用,调用 C 或 C++ 实现的本地方法的代码返回结果。
> 程序计数器: Java 线程私有,类似于操作系统里的 PC 计数器,它可以看做是当前线程所执行的字节码的行号指示器。
 - 如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器值则为空(Undefined)
 
> 虚拟机栈(栈内存):Java线程私有,虚拟机栈描述的是 Java 方法执行的内存模型
 
> 本地方法栈 :和 Java 虚拟机栈的作用类似,区别是该区域为 JVM 提供使用 Native 方法的服务
 
 
> 堆内存(线程共享):所有线程共享的一块区域,垃圾收集器管理的主要区域
 - 每个方法在执行的时候,都会创建一个栈帧用于存储局部变量、操作数、动态链接、方法出口等信息。
 - 每个方法调用都意味着一个栈帧在虚拟机栈中入栈到出栈的过程。
 
> 方法区(线程共享):各个线程共享的一个区域,用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
 - 线程共享区域,因此这是线程不安全的区域。
 - 方法区存储的是从Class文件加载进来的静态变量、类信息、常量池以及编译器编译后的代码。
 

- 存储的是我们new来的对象,不存放基本类型和对象引用。
- 由于创建了大量的对象,垃圾回收器主要工作在这块区域。
- 线程共享区域,因此是线程不安全的。
 
Java堆区还可以划分为新生代和老年代,新生代又可以进一步划分为Eden区、Survivor 1区、Survivor 2
- 线程私有区域,每一个线程都有独享一个虚拟机栈,因此这是线程安全的区域。
- 存放基本数据类型以及对象的引用。
- 每一个方法执行的时候会在虚拟机栈中创建一个相应栈帧,方法执行完毕后该栈帧就会被销毁。
- 方法栈帧是以先进后出的方式虚拟机栈的。每一个栈帧又可以划分为局部变量表、操作数栈、动态链接、方法出口以及额外的附加信息。
- 这个区域可能有两种异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常(通常是递归导致的);JVM动态扩展时无法申请到足够内存则抛出OutOfMemoryError异常。
栈内存用来存储基本类型的变量和对象的引用变量;堆内存用来存储Java中的对象,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。
栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存;堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。
芋道源码 , 很不错的源码博客
以及所有对该文章有所帮助的表示感谢

摘要: 定义: 定义一系列算法, 把他们一个个封装起来, 并且使他们可互相替换(变化). 模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化). 理解: 比如说要读取配置文件,有好几种配置文件,json,yaml,xml,以后可能还要扩展, 可以将每种文件类型都设计为一个类,每个类中都有一个r

摘要: 定义: 在一个方法中定义了一个算法的骨架或者步骤,而将一些步骤延迟到子类中去实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某一些步骤 自己理解: 在父类中设计好整体框架,比如调用顺序,将可扩展可改变写作虚函数,让子类自己去实现或重写。 在不改变程序整体结构的情况下,改变了程序的

摘要: 函数中的静态变量(初始化一次,后续进入函数不再进行重置) static 在类或者机构体中,只被初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量由对象共享。对于不同的对象,不能有相同静态变量的多个副本。因为这个原因,静态变量不能使用构造函数初始化 类中的静态成员函数 :静态成员函数

软工是国际的还是信工的呢,如果是国际学院的,那就是学c学java学c++,jsp,sql,net,javaee,安卓,大体上是这些还有一些别的软件工程,网页设计那些课程


我要回帖

更多关于 java比c++好在哪 的文章

 

随机推荐