社区
Java SE
帖子详情
JVM能不能自动释放string所占用的存储空间
SimonDW
2005-04-04 09:28:11
Java里string对象是静态保存的。
如果程序中使用的字符串很多的话,这个所占用的空间就会很大。
我做的项目里有这样的问题:
因为要做log,所以会不断产生随时间变化而变化的字符串。
这样的话,就导致了使用了的heap堆不断增长。
如果产生速度比较快的话,就会明显的增长。
我想知道的是,这里的string会不会过一段时间后自动回收
被回收不常使用的部分?
...全文
428
10
打赏
收藏
JVM能不能自动释放string所占用的存储空间
Java里string对象是静态保存的。 如果程序中使用的字符串很多的话,这个所占用的空间就会很大。 我做的项目里有这样的问题: 因为要做log,所以会不断产生随时间变化而变化的字符串。 这样的话,就导致了使用了的heap堆不断增长。 如果产生速度比较快的话,就会明显的增长。 我想知道的是,这里的string会不会过一段时间后自动回收 被回收不常使用的部分?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
SimonDW
2005-04-10
打赏
举报
回复
不过,好像我分析错,不是字符串占用的空间,
是用的log4j可能有什么缓存系统。
SimonDW
2005-04-10
打赏
举报
回复
String 是immutable的类,是我弄错了。
到这里问,有时候还是能得到点东西的。
DanielYWoo你给的连接就很有用。
资料找起来,有时候真的是没办法一下子就能找到。
我只是需要足够确定的证据。
其实只要把heap的最大值设小点,等到极限了,
就会执行Full GC, log 里就可以看到变化了。
wyx424
2005-04-06
打赏
举报
回复
你最好是写自己的回收代码,GC是不可靠的,因为没人会知道它什么时候会运行
cuij7718
2005-04-06
打赏
举报
回复
对用StringBuffer,在处理大量的字符串的时候StringBuffer得效果提升很明显
DanielYWoo
2005-04-06
打赏
举报
回复
>>Java里string对象是静态保存的。
要么你说错了,要么就是我理解错你的意思了。constant pool里的虽然是共享的,但绝不是静态的,heap里的就更不是了。
>>你最好是写自己的回收代码,GC是不可靠的
汗...
楼主,先看看这个再问,
http://java.sun.com/docs/hotspot/gc/
如果你懂了eden,generation, full gc, reachable的概念,你根本不用来论坛上问,问也是白问,大多数人都是一知半解来胡弄你的分
kenny1979
2005-04-06
打赏
举报
回复
回复人: wyx424(思远) ( ) 信誉:100 2005-04-06 12:55:00 得分: 0
你最好是写自己的回收代码,GC是不可靠的,因为没人会知道它什么时候会运行
**************************************************************************
内存空间回收能自己写吗? 楼上的指条路!
hongyan2004
2005-04-05
打赏
举报
回复
最好不要用STRING,用STRINGBUFFER更好,
是的,是过一段时间就会被GC回收
yonggui111
2005-04-04
打赏
举报
回复
最好用StringBuffer类,要转换的时候用.toString()方法.
最好不要用 String s = "xxx";
kingfish
2005-04-04
打赏
举报
回复
String s = new String("xxxxxxx");
这样是在heap上分配空间,如果s上没有任何引用, 那么就会被GC收集
水之轮回
2005-04-04
打赏
举报
回复
JAVA里的垃圾回收机制是可以回收String用过后的内存空间,但照你的意思的话还是不要靠JVM的回收机制来回收你的String所花费的内存,因为JAVA里的回收机制并不是很可靠的,你不可能知道它何时才会启动,而且每次都要等到下次运行回收机制时才真正的回收你所不用的内存。
java
string
内存
占用
_
JVM
系列之:
String
,数组和集合类的内存
占用
大小
简介之前的文章中,我们使用JOL工具简单的分析过
String
,数组和集合类的内存
占用
情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧。数组先看下JOL的代码和输出://byte arraylog.info("{}",ClassLayout.parseInstance("www.flydean.com".getBytes()).toPri...
JVM
--
String
详解,
JVM
中的
String
String
的基本特性 注意:
String
s2 = new
String
(“hello”)方式创建字符串,堆中存放值为hello的对象,同时会在字符串常量池中创建一个hello字符串常量 字符串常量池: 字符串常量池通过固定大小的Hashtable实现,通过Hash值类判断是否有相同字符串,如果这个大小值国小,就会导致有多个字符串具体相同的hash值,就会以链表的形式存放,如果链表过长就会导致效率变低。
String
Table具有GC操作。 如果设置的值不在指定范围内,就会报如下错误: Strin
JVM
系列之:
String
,数组和集合类的内存
占用
大小
文章目录简介数组
String
ArrayListHashMapHashSetLinkedListtreeMap总结 简介 之前的文章中,我们使用JOL工具简单的分析过
String
,数组和集合类的内存
占用
情况,这里再做一次更详细的分析和介绍,希望大家后面再遇到OOM问题的时候不再抱头痛哭,而是可以有章可循,开始吧。 数组 先看下JOL的代码和输出: //byte array log.info("{}",ClassLayout.parseInstance("www.flydean.com".getBytes())
(修改后)Java中的
String
类
占用
多大的内存空间?
空
String
占用
的空间 40 对象头(8 字节)+ 引用 (4 字节 ) + char 数组(16 字节)+ 1个 int(4字节)+ 1个long(8字节)= 40 字节 非空
String
占用
的空间 40 + 2 * n (代表字符串长度) char[]数组中的一个char类型的数据
占用
2个字节的空间,所以,只是
String
中的数据就会
占用
2 * n(n为字符串的长度)个字节的空间,再加上空字符串所
占用
的40个字节空间,最终得出一个字符串所
占用
的
存储空间
为: 40 + 2 * n (n为字符串长度
JVM
中
String
Table详解
String
在JDK9中存储结构变更:官方网站说明:JEP 254: Compact
String
s (java.net) 对官方中的内容说明进行翻译: 动机目前类的实现将字符存储在一个数组中,每个字符使用两个字节(16位)。从许多不同的应用中收集到的数据表明,字符串是堆使用的主要组成部分,此外,大多数字符串对象只包含Latin-1字符。这些字符只需要一个字节的
存储空间
,因此这些字符串对象的内部字符数组中有一半的空间没有被使用。 说明 我们建议将类的内部表示方法从字符数组改为字节数组加编码标志域。新的Str
Java SE
62,635
社区成员
307,269
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章