在了解java内存分析的同时,除了"堆"之外,我还不断看到"perm space"这个术语.我知道堆是什么 - 什么是烫发空间?
我有一个webapp,我正在进行一些负载/性能测试,特别是在我们希望有几百个用户访问同一页面并在此页面上每10秒点击一次刷新的功能.我们发现我们可以使用此功能进行改进的一个方面是在一段时间内缓存来自Web服务的响应,因为数据没有变化.
在实现这个基本缓存之后,在一些进一步的测试中,我发现我没有考虑并发线程如何同时访问Cache.我发现在大约100毫秒内,大约有50个线程试图从缓存中获取对象,发现它已经过期,命中Web服务以获取数据,然后将对象放回缓存中.
原始代码看起来像这样:
private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) {
final String key = "Data-" + email;
SomeData[] data = (SomeData[]) StaticCache.get(key);
if (data == null) {
data = service.getSomeDataForEmail(email);
StaticCache.set(key, data, CACHE_TIME);
}
else {
logger.debug("getSomeDataForEmail: using cached object");
}
return data;
}
Run Code Online (Sandbox Code Playgroud)
因此,为了确保在对象key过期时只有一个线程正在调用Web服务,我认为我需要同步Cache get/set操作,并且似乎使用缓存键是一个很好的候选对象同步(这样,对电子邮件b@b.com的此方法的调用不会被方法调用a@a.com阻止).
我将方法更新为如下所示:
private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) {
SomeData[] data = null;
final String key = "Data-" + email;
synchronized(key) {
data =(SomeData[]) StaticCache.get(key);
if (data == null) {
data = service.getSomeDataForEmail(email); …Run Code Online (Sandbox Code Playgroud) java multithreading synchronization synchronized thread-safety
如果我使用String.intern()来提高性能,因为我可以使用"=="来比较实习字符串,我会遇到垃圾收集问题吗?实习字符串的垃圾收集机制与普通字符串有何不同?
根据著名本书深入浅出Java页面661:
" Garbage Collector doesn't go inside String pool."
在阅读了关于SO的类似问题后,我发现了如下混合答案:
我的问题是:
如何在Java 6及之前收集字符串文字垃圾?
因为在Java 7中,将在堆上创建字符串文字,与Java 6相比,Java 7中字符串文字的垃圾收集将如何不同?
假设我有一个为Web应用程序创建新用户的方法.该方法本身调用一个静态助手类,该类创建一个SQL语句,用于执行实际插入到我的数据库中.
public void createUserInDb(String userName){
SQLHelper.insertUser(userName);
}
Run Code Online (Sandbox Code Playgroud)
我希望同步此方法,以便如果传入的参数(userName)在这些线程上相同,则不能由不同的线程同时调用它.我知道我可以使用synchronized关键字同步方法执行,但这会阻止不同的线程同时执行该方法.如果传入的变量相同,我只想防止并发执行.Java中有一个简单的构造可以让我这样做吗?
在我正在处理的遗留代码库中,有大量的String文字.其中很多都是重复的.例如,字符串"userID"用于500个地方.可能有一千种这样的文字以重复的方式使用.IntelliJ Idea静态代码分析表明我将它们提取为常量.如果IDE为我自动重构,没有我键入一行代码,我应该去吗?
通常,将许多这样的重复字符串文字提取为常量是一个好主意吗?这显然可以避免重复,提供单点访问,声明等.
但是,这些文字中的一些在访问时会出现.如果我将所有文字声明为常量(静态最终),那么所有这些文字将被加载在一起.在这种情况下,将所有这些文字声明为常量是一个好主意吗?你能提供一些指向垃圾收集的指针,在这种情况下的内存空间预防措施吗?在这种情况下使用的最佳做法是什么?
一些注意事项:我知道字符串文字被实习.所以我不会在最坏的情况下保存任何内存.此外,似乎jdk 7将这些字符串放在堆而不是permgen.我看到了夫妻 的 问题,像我,但觉得这是不同的.所以在这里发布.
谢谢